- 옆쪽 여러 컨트롤러들이랑 storyboard의 각 controller를 연결 시켜주었다.
-이런식으로 연결해주면된다.
만들어주기
import Foundation
extension NSObject {
public var className: String {
return String(describing: type(of: self)).components(separatedBy: ".").last!
}
public class var className: String {
return String(describing: self).components(separatedBy: ".").last!
}
}
- 클래스명을 편하게 가저올수있도록 extension으로 하나빼준다.
import UIKit
enum CMStory : Int {
public struct Board {
public static let main = "Main"
}
case main = 0
case permission = 1
static func create(_ scene: UIWindowScene ,type: CMStory, navBar: Bool = true, board: String = CMStory.Board.main) -> UIWindow {
switch type {
case .main: return CMStroyBoard.createWindow( scene, boardId: board, viewId: MainView.className, navigationBar: navBar)
case .permission: return CMStroyBoard.createWindow( scene, boardId: board, viewId: PermissionView.className, navigationBar: navBar)
}
}
}
- 바로 window 객체를 리턴해줄수있도록 생성해준다.
import UIKit
public final class CMStroyBoard {
//storyboard
public static func createWindow(_ scene: UIWindowScene,
boardId: String,
viewId: String,
navigationBar: Bool = false) -> UIWindow {
let window: UIWindow = UIWindow(frame: UIScreen.main.bounds)// window가 없으니 만들어준다.
let mainBoard = UIStoryboard(name: boardId, bundle: nil)// 스토리보드 인스턴스
let vc = mainBoard.instantiateViewController(withIdentifier: viewId)//뷰 컨트롤러 인스턴스
if navigationBar == true {
window.rootViewController = UINavigationController(rootViewController: vc)
}else{
window.rootViewController = vc// 윈도우의 루트 뷰 컨트롤러 설정
}
window.windowScene = scene
window.makeKeyAndVisible()
return window
}
//no storyboard
public static func createWindow(_ scene: UIWindowScene,
vc: UIViewController,
navigationBar: Bool = false) -> UIWindow {
let window: UIWindow = UIWindow(frame: UIScreen.main.bounds)
if navigationBar == true {
window.rootViewController = UINavigationController(rootViewController: vc)
}else{
window.rootViewController = vc
}
window.windowScene = scene
window.makeKeyAndVisible()
return window
}
public static func createViewController(viewId: String) -> UIViewController {
let boardId:String = CMStory.Board.main
let mainBoard = UIStoryboard(name: boardId, bundle: nil)// 스토리보드 인스턴스
let vc = mainBoard.instantiateViewController(withIdentifier: viewId)
return vc
}
}
- window 객체에 rootcontroller를 넘겨준 viewID 로 컨트롤러를찾아 지정해준다.
- createViewController에서 매번 스토리보드를 호출할필요없게 따로 uiviewcontroller를 리턴하게 만들어준다.
private fun shareURL(strJson:String){
val a: ShareUrlVO = Gson().fromJson(strJson, ShareUrlVO::class.java)
val i = Intent(Intent.ACTION_SEND)
i.setType("text/plain")
i.putExtra(Intent.EXTRA_SUBJECT,a.chooserTitle)// 공유했을때 제목
i.putExtra(Intent.EXTRA_TEXT,a.url)//링크 url
startActivity(Intent.createChooser(i, a.subject)); // 위 그림에 나오는 제목부분
}
class ShareUrlVO {
constructor()
constructor(chooserTitle: String, subject: String, url: String) {
this.chooserTitle = chooserTitle
this.subject = subject
this.url = url
}
var chooserTitle: String = ""
var subject: String = ""
var url: String = ""
}
public static final String[] permissionList = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE};
public static final int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 200;
- Common이라는 class안에 저장해서 쓰고있습니다. 아래도 자주 등장하니 참고해 주세요
- permissionList에 원하는 퍼미션을 넣어서 사용하면 됩니다.
permission 물어보기
if (PermissionUtil.haveAllpermission(IntroActivity.this,Common.permissionList)){
// 모든 퍼미션 허용
}
else{
// 퍼미션 하나로도 허용 안함
ActivityCompat.requestPermissions(mactivity,Common.permissionList,Common.MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
}
- PermissionUtil에 haveAllpermission 펑션을 이용해 체크한다.
permission 결과 받기 -> onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//region 요청 코드가 PERMISSIONS_REQUEST_CODE 이고,
// 요청한 퍼미션 개수만큼 수신되었다면
if ( requestCode == Common.MY_PERMISSIONS_REQUEST_READ_PHONE_STATE &&
grantResults.length == Common.permissionList.length) {
boolean check_result = true;
// 모든 퍼미션을 허용했는지 체크합니다.
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
check_result = false;
break;
}
}
//허용
if ( check_result ) {
//허용했을때 로직
}
//거부 ,재거부
else {
if (PermissionUtil.recheckPermission(this,Common.permissionList)){
//거부 눌렀을 때 로직
}
else{
//재거부 눌렀을 때 로직
}
}
}
//end region
}
- onRequestPermissionsResult에서 결과를 받아 허용,거부,재거부일때 진행되는 로직을 설정해줍니다. 여기까지 하시면 몇가지가 안될것입니다.
-PermissionUtil class가 없는데 이제 만들러 가봅시다.
permission Util 만들기
public class PermissionUtil {
/*
* true : all permission granted
* false : some permission deni
* */
public static boolean haveAllpermission(Context c , String[] s){
boolean ispms = true;
for (String pms : s ){
if (ContextCompat.checkSelfPermission(c, pms) != PackageManager.PERMISSION_GRANTED ) {
ispms = false;
break;
}
}
return ispms;
}
/*
* true : 사용자가 거부만 선택한 경우에는 앱을 다시 실행하여 허용을 선택하면 앱을 사용할 수 있습니다.
* false : “다시 묻지 않음”을 사용자가 체크하고 거부를 선택한 경우에는 설정(앱 정보)에서 퍼미션을 허용해야 앱을 사용할 수 있습니다.
* */
public static boolean recheckPermission (Activity activity ,String[] permissions){
boolean isrpms = false;
for (String s : permissions){
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, s)){
isrpms = true;
break;
}
}
return isrpms;
}
}
- haveAllPermission은 모든 퍼미션들이 허용상태일땐 true를 아닐경우 false를 반환합니다.