0

У меня есть серия UIViewControllers в моем приложении, и они представлены с помощью UINavigationController. HOME ViewController вызывает pushViewController для доступа к PROFILES ViewController. Экран PROFILES правильно показывает кнопку «Назад» для HOME. Затем выбор кнопки PROFILES приведет пользователя к DETAIL ViewController. Экран DETAIL правильно показывает кнопку «Назад» для PROFILES. Но когда я нажимаю кнопку «Назад» на PROFILES, я действительно возвращаюсь к экрану PROFILES, но панель навигации на этом экране теперь показывает название HOME без кнопки «Назад». Другими словами, похоже, что IOS 8 однажды щелкнул ViewController, чтобы вернуться из DETAIL в PROFILES, но как-то дважды вытащил элементы навигационной панели!UINavigationController Broken в IOS 8?

Любая идея, как я могу это исправить?

+0

вы можете включить которые механизмы, которые вы используете, чтобы надавить на стек навигации. Вы используете раскадровку? Вы используете segues? Вы используете pushViewController :? Кроме того, ваши журналы упоминают что-либо о поврежденном стеке навигации? – atreat

+0

Я просто использую старый стандартный pushViewController. Я не использую раскадровку или segues. Это действительно базовое кодирование IOS, которое отлично работает в старой версии IOS и XCode, но, похоже, в IOS8 работает с использованием XCode 6. – Marc

+0

Привет, вы получили решение? У меня та же проблема –

ответ

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

Привет, Марк, что такое «IOSVersion.h»? Это другой ваш собственный класс? – Sevren

+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