這是不正確的方式,很少(我想永遠不會)調用init
已經初始化的對象。
我解決這個問題的方法是創建UINavigationController的子類。
在本小類中,我覆蓋initwithrootviewcontroller:
- (id) initWithRootViewController:(UIViewController *)rootViewController
{
UIViewController *fakeController = [[[UIViewController alloc] init] autorelease];
self = [super initWithRootViewController:fakeController];
if(self)
{
self.fakeRootViewController = fakeController;
rootViewController.navigationItem.hidesBackButton = YES;
[self pushViewController:rootViewController animated:NO];
}
return self;
}
的fakeRootViewController實際上什麼也不做,這是爲iOS沒有可能設置RootViewController的一種變通方法。
在另一個函數(setRootViewController:aViewController)中,您隱藏了新的'rootviewcontroller'的後退按鈕,因此用戶從不會看到有假的rootviewcontroller。然後將其推的fakerootviewcontroller
的poptorootviewcontroller應覆蓋,以確保它總是彈出到堆棧的索引1,索引不0
viewcontrollers的吸氣劑應改變,從而它返回一個數組沒有上述fakerootviewcontroller(removeobjectatindex: 0
)
希望這有助於!
謝謝Costique!它工作。請你解釋setViewController是如何工作的? – 2012-04-19 11:27:36
這兩種方法都取代了導航控制器內的整個視圖控制器堆棧。 「舊」控制器獲得釋放。堆棧數組以矩陣控制器開始,其最後一個元素是最頂層的視圖控制器。 – Costique 2012-04-20 05:09:52
@Costique如何設置Root ...假設我必須更改根3次,那麼這種方法是否可以有效地工作? – Dalvik 2015-04-30 13:57:41