PostNotificationName来自shouldSelectViewController内部的异常

时间:2015-04-29 15:01:31

标签: ios objective-c

标签栏有一个注销按钮,可以在点按时立即显示登录屏幕。

我想在离开当前标签视图之前建立一个确认注销警告,因此将以下代码添加到shouldSelectViewController块的开头:

if(viewController == mLogoutCont) {
    // Post notification to initiate showing the logout confirmation alert.
    [[NSNotificationCenter defaultCenter] postNotificationName:@"confirmLogout" object:self  userInfo:nil];
    return false;
}

应用程序在postNotificationName调用内崩溃,并出现以下NSException错误:

2015-04-29 09:40:59.333 TestApplication[5420:210308] -[NSConcreteNotification presentViewController:animated:completion:]: unrecognized selector sent to instance 0x7fe17217cc60
2015-04-29 09:40:59.341 TestApplication[5420:210308] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteNotification presentViewController:animated:completion:]: unrecognized selector sent to instance 0x7fe17217cc60'

如果我注释掉postNotificationName行,当点击“LogOut”标签按钮时,应用程序不会崩溃 - 屏幕上没有任何视觉上的变化 - 由于return false;,这是预期的行为。

1 个答案:

答案 0 :(得分:0)

所以,当" LogOut"按钮在tabBar上点击。感谢@Ricardo和@Larme让我在收到通知后审查被调用的例程。 崩溃的原因是当前的viewController未正确传递到logoutConfirmationAlert,并且在调用presentViewController时发生了NSException。 这是捕获通知时调用的例程:

-(void)logoutConfirmationAlert {
NSLog(@"Entered logoutConfirmationAlert");
UIAlertController* alert;
alert = [UIAlertController alertControllerWithTitle:@"Log Out Confirmation"
                                            message:@"Please confirm that you wish to log out"
                                         preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"Log Out" style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction * action) {

                                                          // [alert dismissViewControllerAnimated:YES completion:nil];
                                                          NSLog(@"Log Out");

                                                          [self signOut];
                                                      }];

UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault
                                                     handler:^(UIAlertAction * action) {
                                                         [alert dismissViewControllerAnimated:YES completion:nil];
                                                         NSLog(@"Cancel");

                                                     }];
[alert addAction:defaultAction];
[alert addAction:cancelAction];

NSLog(@"Before  presentViewController");

[mCurrentViewController presentViewController:alert animated:YES completion:nil];

NSLog(@"Presented alert");
}

我在发布通知之前将当前视图控制器存储在mCurrentViewController中。

我还有一个问题是,在userInfo的{​​{1}}参数中将对当前ViewController的引用作为字典项传递是否合适?