如何加载视图"正确" iOS版

时间:2014-03-28 17:03:08

标签: ios objective-c uinavigationcontroller presentmodalviewcontroller

我的应用包含导航控制器和视图控制器。我的UI的某些部分在故事板上完成,一些部分是从代码启动的(在viewDidLoad中)。我的目标是在appDelegate中通过此方法从推送通知“正确”启动应用程序时加载childViewController X(由后退按钮,唠叨条,标签和表格组成):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

对于你们这可能是一个简单的问题,但我已经问过几天的几个问题(你可以查看我的问题历史)。尝试了几种方法后,我的应用程序:

  • 崩溃
  • 加载没有导航栏
  • 加载导航栏但没有标签(后退按钮不起作用)
  • 使用导航栏加载但
  • 下方有黑屏

只有tableView被拖到故事板上。推断导航栏但我有代码指示其后退按钮和标题。其余的都是通过.m文件中的代码完成的。

我知道人们之前已经问过这个问题,但没有一种方法有效。如何通过推送通知正确加载这个childViewController?

EDIT / UPDATE:

到目前为止我的代码:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSDictionary *dictionary = [launchOptions     objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if (dictionary != nil)
{

UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController* firstVC = [mainstoryboard instantiateViewControllerWithIdentifier:@"NotificationsViewController"];
[self.window.rootViewController addChildViewController:firstVC];
[(UINavigationController *)self.window.rootViewController pushViewController:firstVC animated:NO];
self.window.rootViewController.childViewControllers);
}}

错误代码:

'-[SWRevealViewController pushViewController:animated:]: unrecognized selector sent to instance 0x14575f20'

SWRevealViewController是我的侧边栏菜单视图控制器的库。

UPDATE2: 我也尝试过这种方法:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *initViewController = [storyboard instantiateViewControllerWithIdentifier:@"NotificationsViewController"];

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = initViewController;
[self.window makeKeyAndVisible];

这会加载正确的viewController但没有导航栏。

1 个答案:

答案 0 :(得分:1)

试试这个:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

    if(dictionary != nil) {
        UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
        UIViewController *firstVC = [mainstoryboard instantiateViewControllerWithIdentifier:@"NotificationsViewController"];
        UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;

        // Navigation already created
        if(navigationController) {
            [navigationController pushViewController:firstVC animated:NO];

        // Navigation not created
        } else {
            UINavigationViewController *navigationController = [[UINavigationViewController alloc] initWithRootController:firstVC];

            [self.window setRootViewController:firstVC];
            [self.window makeKeyAndVisible];
        }
    }

    return YES;
}

您的代码中存在一些问题:

  1. 您需要拥有一个UINavigationController才能拥有导航栏并管理推/弹动作,因此您的窗口根控制器应该是 UINavigationController

  2. 如果您需要初始化 UINavigationController ,最好和最简单的方法是直接使用根控制器对其进行初始化,因此请为用户保留push / pop操作:应用程序始终是根控制器,那么为什么不立即创建它?

  3. " addChildController "另一件事:它用于创建自定义容器控制器,这意味着您必须手动实现所有业务逻辑。我建议你只有在经验丰富的情况下才能使用它,因为它可能很难--Cocoa有足够的组件可以将它留给一小部分应用程序。

  4. 您正在使用第三方控制器," SWRevealViewController "。他们应该有一个示例项目,你可以尝试复制"它和他们为您自己的目的定制它。

  5. 如果您的代码运作良好,请告诉我,否则发布新错误,我会尽力帮助您