【问题标题】:Call NavigationController (xib) from ViewController (storyboard)从 ViewController (storyboard) 调用 NavigationController (xib)
【发布时间】:2013-11-04 20:47:06
【问题描述】:

我通常只为我的 iOS 使用故事板,但需要集成一个不使用故事板的 SDK,而不是 xib。我的初始视图控制器来自情节提要,当按下按钮(IBAction)时,我希望它转到 xib 视图控制器,但不确定如何以编程方式执行此操作。这是我的 AppDelegate:

 //AppDelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:...{   

// set to storyboard on launch
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"iPhoneStoryboard"
                                                         bundle: nil];

UIViewController* viewController = [mainStoryboard instantiateInitialViewController];
[self.window setRootViewController:viewController];

 [window makeKeyAndVisible];
 return YES;
 }

这是我的代码.h:

 //mainVC.h
 #import <UIKit/UIKit.h>

 @interface MainVC : UIViewController{
 UIWindow *window;
 UINavigationController *navigationController;
 }

 @property (nonatomic, retain) IBOutlet UIWindow *window;
 @property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
 @property (nonatomic, retain) IBOutlet UIButton *buttonScan;

 -(IBAction) ActionScan;

 @end

还有.m:

 //mainVC.m
 @interface MainVC ()

 @end

 @implementation MainVC

 @synthesize window;
 @synthesize navigationController;
 @synthesize buttonScan;

 - (IBAction)ActionScan{

window.rootViewController = navigationController;
[window makeKeyAndVisible];

 }

【问题讨论】:

    标签: ios objective-c uinavigationcontroller storyboard


    【解决方案1】:

    用initWithNibName创建你的xib viewController实例

    MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
    

    & 然后将此控制器实例推送到导航控制器上

    [self.navigationController pushViewController:desController animated:YES]
    

    【讨论】:

      【解决方案2】:

      在故事板的视图控制器中,代码如下:

      1. alloc & init 目标视图控制器:

        UIViewController *desController = [[SomeViewController alloc]init];

      2. 显示目标视图控制器:

        [self.navigationController pushViewController:desController animated:YES]

        或

        [self.navigationController presentViewController:desController animated:YES completion:nil

      【讨论】:

        【解决方案3】:

        通常你不会直接设置窗口的 rootViewController。相反,您应该使用

         - (IBAction)ActionScan{
            [self presentViewController:self.navigationController animated:YES completion:nil]; 
         }
        

        显示你的下一个视图控制器。这个问题的第一个和被接受的答案给出了它是如何工作的更详细的解释。

        Changing root view controller of a iOS Window

        设置 window.rootViewController 和调用 [window makeKeyAndVisible] 通常发生在您的应用程序委托中,但由于您使用的是故事板,所以它在后台为您完成。

        此外,除非您使用多个窗口,否则您可以使用应用程序委托单例对象从任何地方访问您的 UIWindow。

        MyAppDelegateClass *appDelegate = (MyAppDelegateClass*)[[UIApplication sharedApplication] delegate];
        UIWindow *mainWindow = appDelegate.window;
        

        【讨论】:

        • 如果你想将另一个视图推送到已经存在的 navigationController 上(并且 mainVC 已经在它的 viewController 堆栈上),你需要删除你的属性和实例变量 navigationController 并使用 self.navigationController (由您的 navigationController 自动设置,并由您的同名新变量隐藏)以访问您现有的 UINavigationController。删除 navigationController 属性后,调用 [self.navigationController pushViewController:myViewController animated:YES];
        • 如果它有效,请接受这个答案,或者发布更多详细信息和代码以显示究竟是什么不工作
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-10
        • 1970-01-01
        • 2013-01-24
        • 2020-11-14
        • 1970-01-01
        • 2013-08-26
        相关资源
        最近更新 更多