UINavigationController сбой приложения при использовании setViewControllers - PullRequest
1 голос
/ 22 августа 2010

У меня странная проблема с UINavigationController.

Я написал приложение для отображения данных на трех уровнях.(RootView: выберите данные I, второй вид: выберите данные II, третий вид: отобразите данные).Это прекрасно работает, без проблем.

Проблема появляется, когда приходит PushMessage: в этом случае я пытаюсь создать стек viewController вручную, используя метод setViewControllers: animated: из UInavigationController:

Я инициализирую три контроллера представления (с данными, заголовком и т. Д.) И добавляю их в массив.Этот массив передается упомянутому методу (setViewCOntrollers), и представление верхнего ViewController отображается правильно.Но когда пользователь нажимает кнопку «Назад» в левом верхнем углу, приложение вылетает.Заголовок этой кнопки - это заголовок предыдущего ViewController в стеке, поэтому стек кажется правильным.Эта ошибка возникает, только если при получении Push-уведомления отображается представление rootViewController (что означает вызов метода setViewControllers).

Мой код:

EMASubstituteTeacherScheduleAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
UINavigationController *navController = [appDelegate viewController];

MainViewController *main = [[MainViewController alloc] initWithNibName: @"MainViewController" bundle: nil];
main.navigationItem.title = @"Test";

FormViewController *formSelect = [[FormViewController alloc] initWithNibName: @"FormViewController" bundle: nil];
formSelect.navigationItem.title = @"Test (Level 2)";
formSelect.substDate = [pushData objectForKey: @"date"];

SubstitutesViewController *substDisplay = [[SubstitutesViewController alloc] initWithNibName: @"SubstitutesViewController" bundle: nil];
substDisplay.navigationItem.title = @"Test (Top)";
substDisplay.substDate = [pushData objectForKey: @"date"];
substDisplay.substForm = [pushData objectForKey: @"form"];

NSArray *controllers = [[NSArray alloc] initWithObjects: main, formSelect, substDisplay, nil];
[navController setViewControllers: controllers animated:YES];

Сообщение, отображаемое на консоли: Программа полученасигнал: «EXC_BAD_ACCESS».

Стек вызовов:

'#0 0x3433886c in objc_msgSend'  
'#1 0x3061a828 in -[UIApplication sendAction:to:from:forEvent:]  
'#2 0x3061a7c8 in -[UIApplication sendAction:toTarget:fromSender:forEvent:]  
'#3 0x3061a79a in -[UIControl sendAction:to:forEvent:]  
'#4 0x3061a4ec in -[UIControl(Internal) _sendActionsForEvents:withEvent:]  
'#5 0x3061ab3a in -[UIControl touchesEnded:withEvent:]  
'#6 0x306194ec in -[UIWindow _sendTouchesForEvent:]  
'#7 0x30618e66 in -[UIWindow sendEvent:]  
'#8 0x30614b5a in -[UIApplication sendEvent:]  
'#9 0x30614506 in _UIApplicationHandleEvent  
'#10    0x3323a146 in PurpleEventCallback  
'#11    0x3293daaa in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__  
'#12    0x3293f84e in __CFRunLoopDoSource1 
'#13    0x3294062c in __CFRunLoopRun  
'#14    0x328e98ea in CFRunLoopRunSpecific  
'#15    0x328e97f2 in CFRunLoopRunInMode  
'#16    0x332396ee in GSEventRunModal  
'#17    0x3323979a in GSEventRun  
'#18    0x305be2a6 in -[UIApplication _run]  
'#19    0x305bce16 in UIApplicationMain  
'#20    0x00002512 in main at main.m:14  

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 18 февраля 2014

Имейте ту же проблему, решенную с помощью этого:

@interface MyNavController ()

@property (nonatomic, strong) NSDate* setVCDate;

@end

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
{
    if ( self.setVCDate == nil || [[NSDate date] timeIntervalSinceDate:self.setVCDate] > 1.0 ) {
        [super setViewControllers:viewControllers animated:animated];
        self.setVCDate = [NSDate date];
    } else {
        DLog(@" ***** [UINavigationController setViewControllers:animated: called too fast, ignoring until Apple will fix their s###");
    }
}
0 голосов
/ 24 августа 2010

Полагаю, вы обновляете интерфейс пользователя в основном потоке.

Однажды у меня произошел сбой в навигации, когда я попытался поместить контроллер представления из одного стека навигации в другой стек навигации.Кажется, что контроллер представления, который я пытаюсь установить для другого стека навигации, в настоящее время не может иметь родителя.

Ваш MainViewController является rootViewController для navigationController, когда приходит push-уведомление?Если это так, фреймворку может не понравиться, когда вы попытаетесь поместить MainViewController в стек навигации вручную.Возможно, вам придется удалить mainViewController из стека навигации, прежде чем помещать его в массив для установки viewControllers.Одним из обходных путей будет использование фиктивного viewController в качестве rootViewController, чтобы вы могли легко удалить свой действительный корневой ViewController из стека, используя popToRootViewController, прежде чем использовать этот viewController в новом стеке навигации.

Эта мысль приходит ко мне из твоего вопроса.Ваш случай может совпадать или не совпадать с тем, с которым я столкнулся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...