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

프로그래밍 방식 InitialViewController으로 스토리 보드를 설정하려면 어떻게합니까 ? 실행에 따라 다를 수있는 조건에 따라 스토리 보드를 다른보기로 열고 싶습니다.



답변

더미 초기 뷰 컨트롤러 없이 하는 방법

모든 초기보기 컨트롤러에 스토리 보드 ID가 있는지 확인하십시오.

스토리 보드의 첫 번째보기 컨트롤러에서 “초기보기 컨트롤러입니다”속성을 선택 취소하십시오.

이 시점에서 앱을 실행하면 다음을 읽습니다.

Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?

그리고 앱 델리게이트의 창 속성이 이제 없음을 알 수 있습니다.

앱 설정에서 대상 및 Info탭으로 이동 하십시오. 의 값을 지 웁니다 Main storyboard file base name. 온 General탭의 값을 지 웁니다 Main Interface. 경고가 제거됩니다.

앱 델리게이트의 application:didFinishLaunchingWithOptions:메소드 에서 창과 원하는 초기 뷰 컨트롤러를 만듭니다 .

- (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;
}


답변

모든 Swift 애호가를위한 @Travis 의 답변은 SWIFT 로 번역되었습니다 .

@Travis 가 Objective C 코드 전에 설명한 것을 수행 하십시오. 그때,

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

    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    var exampleViewController: ExampleViewController = mainStoryboard.instantiateViewControllerWithIdentifier("ExampleController") as! ExampleViewController

    self.window?.rootViewController = exampleViewController

    self.window?.makeKeyAndVisible()

    return true
}

ExampleViewController당신이 보여주고 싶은 새로운 초기 뷰 컨트롤러가 될 것입니다.

단계 설명 :

  1. 현재 창의 크기로 새 창을 만들고 기본 창으로 설정
  2. 새로운 초기 뷰 컨트롤러를 만드는 데 사용할 수있는 스토리 보드 인스턴스화
  3. 스토리 보드 ID를 기반으로 새로운 초기 뷰 컨트롤러 인스턴스화
  4. 새 창의 루트 뷰 컨트롤러를 방금 시작한 새 컨트롤러로 설정
  5. 새 창을 보이게

즐거운 프로그래밍을 즐기십시오!


답변

프로그래밍 방식으로 키 창의 rootViewController를 설정할 수 있습니다 (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

예를 들면 다음과 같습니다.

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (shouldShowAnotherViewControllerAsRoot) {
        UIStoryboard *storyboard = self.window.rootViewController.storyboard;
        UIViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"rootNavigationController"];
        self.window.rootViewController = rootViewController;
        [self.window makeKeyAndVisible];
    }

    return YES;
}


답변

스위프트 3 : @ victor-sigler의 코드로 업데이트

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

    // Assuming your storyboard is named "Main"
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    // Add code here (e.g. if/else) to determine which view controller class (chooseViewControllerA or chooseViewControllerB) and storyboard ID (chooseStoryboardA or chooseStoryboardB) to send the user to

    if(condition){
        let initialViewController: chooseViewControllerA = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardA") as! chooseViewControllerA
        self.window?.rootViewController = initialViewController
    )
    }else{
        let initialViewController: chooseViewControllerB = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardB") as! chooseViewControllerB
        self.window?.rootViewController = initialViewController
    )

    self.window?.makeKeyAndVisible(

    return true
}


답변

Navigation rootviewcontroller를 기본보기 컨트롤러로 설정할 수 있습니다. 이 아이디어는 응용 프로그램 요구 사항에 따라 자동 로그인에 사용할 수 있습니다.

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

UIViewController viewController = (HomeController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"HomeController"];

UINavigationController navController = [[UINavigationController alloc] initWithRootViewController:viewController];

 self.window.rootViewController = navController;

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {

    // do stuff for iOS 7 and newer

    navController.navigationBar.barTintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];

    navController.navigationItem.leftBarButtonItem.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];

    navController.navigationBar.tintColor = [UIColor whiteColor];

    navController.navigationItem.titleView.tintColor = [UIColor whiteColor];

    NSDictionary *titleAttributes =@{

                                     NSFontAttributeName :[UIFont fontWithName:@"Helvetica-Bold" size:14.0],

                                     NSForegroundColorAttributeName : [UIColor whiteColor]

                                     };

    navController.navigationBar.titleTextAttributes = titleAttributes;

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

}

else {

    // do stuff for older versions than iOS 7

    navController.navigationBar.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];



    navController.navigationItem.titleView.tintColor = [UIColor whiteColor];

}

[self.window makeKeyAndVisible];

StoryboardSegue 사용자

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

// Go to Login Screen of story board with Identifier name : LoginViewController_Identifier

LoginViewController *loginViewController = (LoginViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@“LoginViewController_Identifier”];

navigationController = [[UINavigationController alloc] initWithRootViewController:testViewController];

self.window.rootViewController = navigationController;

[self.window makeKeyAndVisible];

// Go To Main screen if you are already Logged In Just check your saving credential here

if([SavedpreferenceForLogin] > 0){
    [loginViewController performSegueWithIdentifier:@"mainview_action" sender:nil];
}

감사


답변

메인 스토리 보드를 열고 먼저 시작하려는보기를 선택한 다음 유틸리티-> 속성을 ​​엽니 다. “View Controller”아래에 “Initial View Controller”라디오 버튼이 있습니다. 그냥 선택하십시오.

— 수정 된 질문 :

시도해 볼 수 있습니다 : 초기보기의 ViewDidLoad 섹션에 메소드를 작성하고 응용 프로그램이 실행될 때 메소드가 실행될 때 메소드는 다른보기에 대한 segue를 트리거합니다.


답변

스위프트 5

스토리 보드에서 ViewController를 초기 ViewController로 설정하지 않은 경우 두 가지 작업을 수행해야합니다.

  1. 프로젝트 대상으로 이동하여 프로젝트-> 일반-> 기본 인터페이스 필드 지우기를 선택하십시오.
  2. 항상 프로젝트 대상 내에서 이제 정보-> 응용 프로그램 장면 매니페스트-> 장면 구성-> 응용 프로그램 세션 역할-> 항목 0 (기본 구성)-> 스토리 보드 이름 필드 삭제로 이동하십시오.

마지막으로 SceneDelegate에서 코드를 추가 할 수 있습니다.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    guard let windowScene = (scene as? UIWindowScene) else { return }

    window = UIWindow(windowScene: windowScene)


    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    // Make sure you set an Storyboard ID for the view controller you want to instantiate
    window?.rootViewController = storyboard.instantiateViewController(withIdentifier: identifier)
    window?.makeKeyAndVisible()

}