1

我有一个UIViewController子类(说BBB),从已经写好的自定义UIViewController类(说AAA)继承。 BBB类有一个UITableView,当用户点击UITableView的任何单元格时,我想推入另一个UIViewController类(称为CCC)。从另一个UIViewController推UIViewController - 如何?

所以,我试图推动BBB的tableView: didSelectRowAtIndexPath:方法中的CCC控制器。轻敲单元格时

我的代码,

CCC *ccc = [[CCC alloc] init]; 
[self.navigationController pushViewController:ccc animated:YES]; 
[ccc release]; 

什么也没有发生,所以我用下面的代码进行核对类BBB的naviagtion控制器。

if (self.navigationController == nil) 
{ 
    NSLog(@"Navigation controller is nil"); 
} 

消息已成功打印:)所以,我想有些事情分配到导航控制器和我的运气不好,这是一个只读属性。

然后,我尝试通过分配ccc作为rootviewcontroller来创建本地UINavigationController,然后尝试推送该本地导航控制器。它引发一个异常“不止一次推送相同的视图控制器实例”。

我的问题是,

  • 是否有可能寻找到导航控制器获得AAA级的零值?我没有在我的BBB类中将导航控制器设置为零,我在类AAA中查找是否有类似“self.navigationController = nil”的语句。但没有什么是这样的。

  • 如何推送CCC类?

感谢

+0

什么是你的窗口的根视图控制器?是AAA还是BBB,还是别的?你在使用storyboard或xib,还是在代码中做所有事情? – rdelmar

+0

我的根视图控制器是另一个控制器(比如说DDD)。我只是通过代码来完成这一切。 – Confused

回答

0

要获得self.navigationController属性被设置正确,你必须创建一个UINavigationController[[UINavigationController alloc] initWithRootViewController: aaa]。然后,无论您现在添加aaa(splitViewController或UIWindow等),只需使用您创建的导航控制器即可。

例如,如果您正在设置在你的应用程序代理使用代码的意见,:

AAA *aaa = [[AAA alloc] init]; 
UINavigationController *root = [[UINavigationController alloc] initWithRootViewController: aaa]; 
UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
[window makeKeyAndVisible]; 
window.rootViewController = root; 

现在,aaa.navigationController将指向root,所以你可以做你有什么在你的原职:[self.navigationController pushViewController: bbb animated: YES];

+0

请问,你可以用一些代码来显示它吗? – Confused

+0

我的根视图控制器是另一个类。假设这个类是DDD,我创建了一个类ddd的实例,然后按照你说的方式尝试。它会抛出相同的错误:( – Confused

+0

@Confused更新了帖子,你可以将DDD添加到导航控制器,就像我的示例中那样?将有一个包含ddd的导航控制器,然后它推动aaa,然后可以推BBB? – cscott530

1

把这个放到你的应用程序委托中,你的代码的第一个版本应该可以工作。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [self.window makeKeyAndVisible]; 
    AAA *aaa = [[AAA alloc] init]; 
    self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController: aaa]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 
+0

在我的AppDelegate方法中有很多self.window.rootViewController的赋值。我想知道为什么presentModalViewController:方法工作没有任何问题的概念?为什么不pushViewController? – Confused

+0

UIViewController.navigationController的文档说“视图控制器层次结构中最接近的祖先是导航控制器(只读)”如果层次结构中没有导航控制器 - 意味着您没有添加导航控制器 - 它将为零并且你调用的所有内容都不起作用。所以如果你正在做[self.navigationController pushViewController:vc]它不会工作。将导航控制器设置为根视图控制器。然后添加你的其他viewControllers它的属性'self.navigationController'将被设置和pushViewController将工作。 – bert

相关问题