我有4個視圖控制器在下拉。當我從下拉列表中選擇一個視圖控制器,如果視圖控制器已經在堆棧中(即已經推入)它應該被彈出或者被推入。如何知道視圖控制器是否在堆棧中。如果它在堆棧中應該彈出或否則它應該被推
回答
for (UIViewController*vc in [self.navigationController viewControllers]) {
if ([vc isKindOfClass: [TestViewController class]]){
[[self navigationController] popToViewController:vc animated:YES];
}
}
NSInteger index = -1;
NSArray* arr = [[NSArray alloc] initWithArray:self.navigationController.viewControllers];
NSLog(@"View list=== %@",arr);
for(int i=0 ; i<[arr count] ; i++)
{
if([[arr objectAtIndex:i] isKindOfClass:NSClassFromString(@"ViewContollerName")])
{
index = i;
}
}
[self.navigationController popToViewController:[arr objectAtIndex:index] animated:YES];
試試這個:
UIViewController *currentView = [[UIViewController alloc] init];
currentView = [navigationController.visibleViewController retain];
if (![currentView isMemberOfClass:[YourViewController class]])
{
//push
}
else
{
//pop
}
[currentView release];
注:調整如果您正在使用ARC。
確保您引用正確的navigationController
只有在問題中的vc位於導航堆棧頂部時,這纔會起作用。另外,第一行不僅沒有用處,而且在非ARC項目中也存在內存泄漏。 – Tobi 2013-03-08 10:40:05
@Tobi,是的,我做了這個假設。你能解釋爲什麼第一行是內存泄漏嗎? – avenger 2013-03-08 11:45:47
您正在分配一個'UIViewController'並在第一行的'currentView'中保存一個指向它的指針。在第二行中,您將覆蓋所述指針,因此您將失去對第一行中分配的「UIViewController」的引用,因此根本無法釋放它。 – Tobi 2013-03-08 21:57:01
你可以簡單地檢查你要推或流行的視圖 - 控制的navigationController
propterty。如果vc在導航堆棧上,則設置此屬性,如果不是,則爲nil
。這樣可以避免迭代堆棧中的所有vcs,並進行醜陋的類測試。
說你要知道,如果theVC
是導航控制器堆棧上,你可能只是這樣做:
if (theVC.navigationController == nil)
//push the vc on the nav stack
else
//pop the vc from the nav stack
如果類的「視圖控制器」相同的情況下,可以在navigationController發生,這將更好地工作
-(void)gotoViewController:(id)viewController
{
if ([self.navigationController.viewControllers containsObject:viewController])
{
[self.navigationController popToViewController:viewController animated:YES];
}
else
{
[self.navigationController pushViewController:viewController animated:YES];
}
}
我會建議更好地維護一個數組。您只需要維護導航控制器的關鍵字,這是如何添加對象其邏輯不切合實際,所以相應地瞭解它
檢索時檢查數組中是否存在對象,如果是彈出它。並且當它從堆棧中移除時,其他人推它
資源開放/免費時,版主有什麼錯誤,您可以如何阻止我的帳戶。這裏的主持人就像大笨蛋,沒有大腦,或者即使他們有我猜它的隱藏屬性設置爲TRUE。 – 2013-04-03 10:53:47
- 1. 視圖控制器如何知道它何時被解散或彈出導航控制器堆棧?
- 2. 如何'彈出'到視圖控制器不在堆棧上
- 3. 如何檢查視圖控制器是否被添加到堆棧中
- 4. 堆棧的頂部應該在堆棧的鏈表中實現?
- 5. Objective C--完成塊和視圖控制器被彈出堆棧
- 6. 堆棧應該如何使用大對象堆棧?
- 7. 如何知道視圖堆棧中的最新視圖控制器
- 8. iPhone釋放模式視圖控制器也彈出推控制器到堆棧?
- 9. 在堆棧彈出
- 10. 如何訪問堆棧視圖中的視圖控制器?
- 11. 「堆棧」是什麼意思,而不是在推/彈出,但在「軟件堆棧」
- 12. 活動堆棧不工作,因爲它應該是
- 13. UIViewController知道它是否被推或彈出?
- 14. 如何在MIPS中推送和彈出堆棧中的地址
- 15. 我們是否應該記錄HTTP 400的堆棧跟蹤
- 16. 如何知道活動是否位於堆棧頂部
- 17. Xcode:視圖控制器何時添加到視圖堆棧中?
- 18. iOS在tabbar應用程序中將視圖推入堆棧
- 19. 如何將新的視圖控制器推到不同的導航控制器堆棧並切換到它?
- 20. 如何溢出堆棧而不推送新的堆棧幀?
- 21. presentViewControler推動所有控制器堆棧
- 22. 如何確定內存是否屬於堆或堆棧?
- 23. 如何推視圖控制器到導航堆棧後,在執行popToRootViewController
- 24. 有沒有辦法找出視圖控制器是否從導航堆棧中彈出?
- 25. 堆棧自動修改時不應該
- 26. 如何在AIR應用程序中隱藏視圖堆棧?
- 27. 在導航堆棧上推視圖
- 28. 我應該讓堆棧段很大還是堆段很大?
- 29. 堆棧或堆
- 30. 如何檢查堆棧是否爲空
發表一些代碼你做了什麼? – 2013-03-08 10:22:06