我对Objective-C相对较新,并且来自Java背景,因此我发现指针的概念和解释不充分的编译错误相当令人生畏。

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

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



错误消息,使用 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。我假设这一定是某种可见性问题,但是我不确定如何解决此问题。

最佳答案

如果您的 View Controller 嵌入在UINavigationController中,则segue.destinationViewController引用该导航 Controller 。这是您可以使用的:

- (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中的 View Controller ,则通常将其添加到prepareForSegue:sender的开头:
if ([segue.destinationViewController isKindOfClass:[UINavigationController subclass]])
        id vc = [[(UINavigationController *)segue.destinationViewController viewControllers] lastObject]

现在vc包含了您实际上感兴趣的 View Controller ,因此您不必为每个序列复制和粘贴内容。

09-30 19:05