반응형

기본준비

 

- 옆쪽 여러 컨트롤러들이랑 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를 리턴하게 만들어준다.

 

사용

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?


    func scene(_ scene: UIScene,
    			willConnectTo session: UISceneSession,
    			options connectionOptions: UIScene.ConnectionOptions) {
        guard let sc = (scene as? UIWindowScene) else { return }
        window = CMStory.create(sc, type: .permission, navBar : true)
    }
		....


}

- 간결하게 root controller를 enum 타입으로 호출할수있다.

 

let myvc = CMStroyBoard.createViewController(viewId: LoginView.className) as! LoginView
self.push(viewController: myvc)

- 이런식으로 바로 가저와 uiviewController객체를 사용할수있다.

- 메모리관리에 좋은지는 테스트가 필요하다.

반응형

+ Recent posts