[ios] Appdelegate에서 초기 뷰 컨트롤러 설정-Swift

appdelegate에서 초기 viewcontroller를 설정하고 싶습니다. 나는 정말 좋은 대답을 찾았지만, 목표 C에 있고 신속하게 같은 일을 달성하는 데 어려움을 겪고 있습니다.

스토리 보드를 사용하여 초기 뷰 컨트롤러를 프로그래밍 방식으로 설정

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

    UIViewController *viewController = // determine the initial view controller here and instantiate   it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>];

    self.window.rootViewController = viewController;
    [self.window makeKeyAndVisible];

    return YES;
}

누구든지 도울 수 있습니까?

초기 Viewcontroller가 조건문을 사용하여 충족되는 특정 조건에 종속되기를 원합니다.



답변

이 스레드를 사용하여 목표 C를 신속하게 변환하고 완벽하게 작동하도록했습니다.

Swift에서 viewController 인스턴스화 및 표시

스위프트 2 코드 :

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let initialViewController = storyboard.instantiateViewControllerWithIdentifier("LoginSignupVC")

    self.window?.rootViewController = initialViewController
    self.window?.makeKeyAndVisible()

    return true
}

스위프트 3 코드 :

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let initialViewController = storyboard.instantiateViewController(withIdentifier: "LoginSignupVC")

    self.window?.rootViewController = initialViewController
    self.window?.makeKeyAndVisible()

    return true
}


답변

이 시도. 예를 들어 : UINavigationController초기보기 컨트롤러로 사용해야합니다 . 그런 다음 스토리 보드에서 모든보기 컨트롤러를 루트로 설정할 수 있습니다.

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    let storyboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let navigationController:UINavigationController = storyboard.instantiateInitialViewController() as UINavigationController
    let rootViewController:UIViewController = storyboard.instantiateViewControllerWithIdentifier("VC") as UIViewController
    navigationController.viewControllers = [rootViewController]
    self.window?.rootViewController = navigationController
    return true
}

스토리 보드 화면을 참조하십시오 .


답변

스위프트 3, 스위프트 4 :

스토리 보드에서 루트 뷰 컨트롤러를 인스턴스화하십시오.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // this line is important
        self.window = UIWindow(frame: UIScreen.main.bounds)

        // In project directory storyboard looks like Main.storyboard,
        // you should use only part before ".storyboard" as it's name,
        // so in this example name is "Main".
        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)

        // controller identifier sets up in storyboard utilities
        // panel (on the right), it called Storyboard ID
        let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController

        self.window?.rootViewController = viewController
        self.window?.makeKeyAndVisible()
        return true
    }

UINavigationController루트 로 사용하려는 경우 :

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // this line is important
        self.window = UIWindow(frame: UIScreen.main.bounds)

        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController
        let navigationController = UINavigationController.init(rootViewController: viewController)
        self.window?.rootViewController = navigationController

        self.window?.makeKeyAndVisible()
        return true
    }

xib에서 루트 뷰 컨트롤러를 인스턴스화하십시오.

거의 동일하지만 선 대신

let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewControllerIdentifier") as! YourViewController

당신은 작성해야합니다

let viewController = YourViewController(nibName: "YourViewController", bundle: nil)


답변

스토리 보드를 사용하지 않는 경우 시도해 볼 수 있습니다

var window: UIWindow?
var initialViewController :UIViewController?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    initialViewController  = MainViewController(nibName:"MainViewController",bundle:nil)

    let frame = UIScreen.mainScreen().bounds
    window = UIWindow(frame: frame)

    window!.rootViewController = initialViewController
    window!.makeKeyAndVisible()

    return true
}


답변

새로운 Xcode 11.xxx 및 Swift 5.xx의 경우 대상이 iOS 13 이상으로 설정됩니다.

새로운 프로젝트 구조의 경우 AppDelegate는 rootViewController와 관련하여 아무것도 할 필요가 없습니다.

새로운 클래스는 window (UIWindowScene) 클래스-> ‘SceneDelegate’파일을 처리하기 위해 존재합니다.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = // Your RootViewController in here
        self.window = window
        window.makeKeyAndVisible()
    }

}


답변

여기에 접근하는 좋은 방법이 있습니다. 이 예에서는 내비게이션 컨트롤러를 루트 뷰 컨트롤러로 배치하고 원하는 뷰 컨트롤러를 내비게이션 스택의 맨 아래에 배치하여 필요한 것을 푸시 할 수 있습니다.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    // mainStoryboard
    let mainStoryboard = UIStoryboard(name: "MainStoryboard", bundle: nil)

    // rootViewController
    let rootViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainViewController") as? UIViewController

    // navigationController
    let navigationController = UINavigationController(rootViewController: rootViewController!)

    navigationController.navigationBarHidden = true // or not, your choice.

    // self.window
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    self.window!.rootViewController = navigationController

    self.window!.makeKeyAndVisible()
}

이 예제가 작동하게하려면 메인보기 컨트롤러에서 “MainViewController”를 스토리 보드 ID로 설정하고이 경우 스토리 보드의 파일 이름은 “MainStoryboard.storyboard”입니다. Main.storyboard가 나에게 적합한 이름이 아니기 때문에 스토리 보드 이름을 이런 식으로 바꿉니다.


답변

나는 objective-c에서 그것을 했어.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

UIViewController *viewController;

NSUserDefaults *loginUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *check=[loginUserDefaults objectForKey:@"Checklog"];

if ([check isEqualToString:@"login"]) {

    viewController = [storyboard instantiateViewControllerWithIdentifier:@"SWRevealViewController"];
} else {

    viewController = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
}


self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];