访问UIViewController的prepareForSegue中的属性

时间:2012-06-29 19:01:14

标签: objective-c ios5 xcode4.3

我是Objective-C的新手,我来自Java背景,因此我发现指针的概念而不是 - 那很好地解释了编译错误相当令人生畏。

我有一个使用jsonControllerDidLinkedInAuth方法实现委托的类。每当委托人向此类发送消息,传递自身和(NSURL *)网址时,我正在尝试将网址分配给属性 authUrl ,当这个操作完成后调用performSegueWithIdentifier,后者又执行prepareForSegue(就我对此的理解而言)。

这似乎不起作用,因为我收到了:

  

App [3278:13517] * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [UINavigationController setUrlAddress:]:无法识别的选择器发送到实例0x6acab00'

使用 SIGABRT 终止应用程序的错误消息。

这两个方法都驻留在同一个类中,它是一个UINavigationController并指向另一个UINavigationController。编译器将我指向第二种方法的[vc setUrlAddress:self.authUrl];

- (void)jsonControllerDidLinkedInAuth:(JsonController *)controller :(NSURL *)url {
    authUrl = url;
    if (authUrl != nil) {
        [self performSegueWithIdentifier:@"LinkedInAuth" sender:self];
    } else {
        NSLog(@"Auth URL is null");
    }
}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"LinkedInAuth"]) {
        // Get destination view
        LinkedInViewController *vc = [segue destinationViewController];
        NSLog(@"The auth url from prepareForSegue in SignupViewControlle: %@", self.authUrl);
        [vc setUrlAddress:self.authUrl];
    }
}

似乎问题是由于某种原因我无法访问当前类的authUrl属性。我尝试使用authUrl,[self authUrl]和self.authUrl,但这似乎没有做到这一点。 属性是合成的,但我也注意到一点提示:“UINavigationController setUrlAddress”,这不应该像上面方法中定义的LinkedInViewController一样吗?我尝试了(LinkedInViewController)[segue destinationViewController],但后来我收到一条消息,通知我你不能投射指针。

任何帮助都将受到高度赞赏。谢谢你的阅读。

编辑1:setUrlAddress正上方的NSLog确实返回self.authUrl。我假设它必须是某种可见性问题,但我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:21)

如果您的视图控制器嵌入在UINavigationController中,segue.destinationViewController指的是该导航控制器。这是你可以使用的:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

        if ([[segue identifier] isEqualToString:@"LinkedInAuth"]) {
            UINavigationController *navigationController = (UINavigationController *)segue.destinationViewController;
            LinkedInViewController *linkedInViewController = [[navigationController viewControllers] lastObject];
            linkedInViewController setUrlAddress:self.authUrl];
        }
}

如果你有超过1个segue转换到嵌入在UINavigationController中的视图控制器,我通常会将其添加到prepareForSegue:sender的开头:

if ([segue.destinationViewController isKindOfClass:[UINavigationController subclass]])
        id vc = [[(UINavigationController *)segue.destinationViewController viewControllers] lastObject]

现在vc包含您真正感兴趣的视图控制器,因此您不必为每个segue复制和粘贴转换。

答案 1 :(得分:0)

看起来您不是要分配委托,您需要这样才能使委托模式起作用。尝试将vc.delegate = self添加到prepareForSegue。