0

我在我的應用程序中有一系列UIViewControllers,並且這些都是使用UINavigationController呈現的。 HOME ViewController調用pushViewController進入PROFILES ViewController。 PROFILES屏幕正確顯示返回按鈕到HOME。然後在PROFILES上選擇一個按鈕將使用戶進入DETAIL ViewController。 DETAIL屏幕正確顯示PROFILES的後退按鈕。但是當我將後退按鈕按下到PROFILES時,我確實回到PROFILES屏幕,但屏幕上的導航欄現在顯示標題HOME,沒有後退按鈕。換句話說,看起來IOS8已經彈出ViewController一次從細節返回到PROFILES,但以某種方式彈出導航欄項目兩次!UINavigationController在IOS 8中損壞?

任何想法如何解決這個問題?

+0

你可能要包括哪些你用來推入導航堆棧的機制。你使用故事板嗎?你在使用segues嗎?你使用pushViewController:?另外,你的日誌中是否提到了有關腐敗導航堆棧的任何內容? – atreat 2014-10-16 20:39:38

+0

我只是使用舊的標準pushViewController。我不使用storyboard或segues。這是非常基本的IOS編碼,可以在舊版本的IOS和XCode中正常工作,但似乎在使用XCode 6的IOS8中被破壞。 – Marc 2014-10-16 21:09:15

+0

您是否得到了解決方案?我有同樣的問題 – 2014-11-26 09:02:33

回答

0

顯然,解決方案的輪廓可以在這裏找到: UINavigationController and UINavigationBarDelegate.ShouldPopItem() with MonoTouch

在我的解決方案,我只是有我所有的視圖控制器擴展CustomUINavigationController,它看起來像這樣:

#import "CustomUINavigationController.h" 
#import "IOSVersion.h" 

@interface CustomUINavigationController() 

@end 

@implementation CustomUINavigationController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    self.delegate=self; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

// 
// The following two methods are the key to overriding the buggy behavior in IOS 8 
// The first method is from here: 
// https://stackoverflow.com/questions/6413595/uinavigationcontroller-and-uinavigationbardelegate-shouldpopitem-with-monotouc 
// 
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item { 
    NSLog(@"Inside shouldPopItem"); 
    if (regularPop) { 
     NSLog(@"regularPop is TRUE"); 
    } else { 
     NSLog(@"regularPop is FALSE"); 
    } 
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { 
     if (regularPop) { 
      regularPop = FALSE; 
      return YES; 
     } 

     regularPop = TRUE; 
     [self popViewControllerAnimated:YES]; 
     return NO; 
    } else { 
     return [super navigationBar:navigationBar shouldPopItem:item]; 
    } 
} 

- (UIViewController *)popViewControllerAnimated:(BOOL)animated 
{ 
    NSLog(@"Inside popViewControllerAnimated"); 
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { 
     NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:self.viewControllers]; 
     int cnt=(int)[viewControllers count]; 
     NSLog(@"Inside popViewControllerAnimated, cnt is %d",cnt); 
     UIViewController *vc=[viewControllers objectAtIndex:cnt-2]; 
     if (regularPop) self.desiredVC=vc; 
     [self popToViewController:vc animated:animated]; 
     return vc; 
    } else { 
     return [super popViewControllerAnimated:animated]; 
    } 

} 

- (UIViewController *)manualpopViewControllerAnimated:(BOOL)animated { 
    NSLog(@"Inside manualpopViewControllerAnimated"); 
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { 
     regularPop=TRUE; 
     return [self popViewControllerAnimated:animated]; 
    } else { 
     return [super popViewControllerAnimated:animated]; 
    } 
} 

- (void)navigationController:(UINavigationController *)navigationController 
    didShowViewController:(UIViewController *)viewController 
       animated:(BOOL)animated { 
    NSLog(@"Inside didShowViewController"); 
    if (viewController==self.desiredVC) { 
     NSLog(@"Inside didShowViewController, found desiredVC"); 
     regularPop = FALSE; 
    } 
} 

/* 
#pragma mark - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    // Get the new view controller using [segue destinationViewController]. 
    // Pass the selected object to the new view controller. 
} 
*/ 

@end 
+0

Hi Marc,什麼是「IOSVersion.h」?那是你的另一個自定義類嗎? – Sevren 2014-12-11 19:29:37

+0

是的,這只是一個我使用的文件,它有像SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@「8.0」)這樣的宏。你當然可以從名字中推斷出他們做了什麼。例如:#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch]!= NSOrderedDescending) – Marc 2014-12-12 00:02:53