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

相關問題