【问题标题】:Unrecognized selector sent to instance when assigning a block property分配块属性时发送到实例的无法识别的选择器
【发布时间】:2015-06-12 22:12:09
【问题描述】:

我有一个应用程序可能需要用户在导航期间进行身份验证。如果是这种情况,我希望登录事件向请求登录事件的操作返回一个回调,以便它知道登录是否成功。

例如,需要身份验证的方法将通过调用帮助程序类的方法来提示输入凭据:

[UserModel promptCredentials:^(NSHTTPURLResponse *response) {
    if (response.statusCode == 200) {
        [self userWillComment:userActionCell];
    }
 }];

helper 方法实例化登录视图控制器,并尝试设置回调属性:

+ (void) promptCredentials:(void (^)(NSHTTPURLResponse *response))callback{

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *currentViewController = [[UIApplication sharedApplication] keyWindow].rootViewController;
    LoginViewController *loginScreenNav = [storyboard instantiateViewControllerWithIdentifier:@"LoginNavigationController"];
    loginScreenNav.loginCallback = callback;
    if([currentViewController isKindOfClass:[UINavigationController class]]){
        currentViewController = [(UINavigationController *)currentViewController visibleViewController];
    } else if(currentViewController.presentedViewController){
        currentViewController = currentViewController.presentedViewController;
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        [currentViewController presentViewController:loginScreenNav animated:YES completion:nil];
    });
}

登录视图控制器在其接口中定义了以下属性:

@property (nonatomic, strong) void (^loginCallback)(NSHTTPURLResponse *response);

当登录发生在“LoginViewController”中时,我正在尝试执行回调,如下所示:

if (self.loginCallback != nil) {
    self.loginCallback(response);
}

但是,当此代码运行时,辅助方法 loginScreenNav.loginCallback = callback; 中的行会导致应用崩溃并出现错误:

-[UINavigationController setLoginCallback:]:无法识别的选择器发送到实例

基本上,我需要一些关于如何在登录视图控制器中正确分配此属性块的指导,以便它可以在登录网络操作发生后执行。

【问题讨论】:

    标签: ios objective-c objective-c-blocks


    【解决方案1】:

    崩溃的原因是你在这行对自己(和编译器)撒谎:

    LoginViewController *loginScreenNav = [storyboard instantiateViewControllerWithIdentifier:@"LoginNavigationController"];
    

    您已经从情节提要中实例化了一个视图控制器,是的;但它不是 LoginViewController。它是一个 UINavigationController。仔细检查你的故事板,看看标有"LoginNavigationController" 标识符的视图控制器,你会发现这是真的。

    【讨论】:

    • 没错,在将实例化从 LoginNavigationController 更改为 LoginViewController 后,代码现在可以按预期工作,这是 IB 中的子类。谢谢指点。
    猜你喜欢
    • 1970-01-01
    • 2019-08-28
    • 2012-07-24
    相关资源
    最近更新 更多