반응형
기본준비
- 옆쪽 여러 컨트롤러들이랑 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객체를 사용할수있다.
- 메모리관리에 좋은지는 테스트가 필요하다.
반응형
'IOS' 카테고리의 다른 글
(IOS)sms로 인증문자 받아서 keyboard위에 띄우기 (0) | 2020.01.30 |
---|---|
(IOS) 토스트 만들기 - objective-c (0) | 2020.01.22 |
(IOS)날짜 비교 (0) | 2020.01.14 |
[IOS]custom bottom sheet (0) | 2019.12.31 |
[IOS] SceneDelegate에서 rootViewcontroller 변경 (0) | 2019.12.31 |