我在服务器上有一个帖子的ID,我想在两个不同的视图控制器中访问它。第一个视图控制器是显示帖子的表格视图。用户将选择一行,该帖子的ID将传递到下一个视图控制器以显示有关该帖子的详细信息。我使用下面的代码。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    PFObject *objectId = [collectionArray objectAtIndex:indexPath.row];
    selectedObjectID = [objectId objectId];
    self.objectID = [objectId objectId];
    [self performSegueWithIdentifier:@"details" sender:self];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier  isEqual: @"details"]) {
        PreviewDetailsViewController *details = (PreviewDetailsViewController *)[segue destinationViewController];
        details.objectID = self.objectID;
    }
}


“ selectedObjectID”是一个外部变量,“ self.objectID”是我为这两个类设置的属性,并尝试在prepareForSegue方法中对其进行设置。这两种方式都做同样的事情。它将变量传递给下一个视图控制器,但是当我

NSLog(@"object = %@", self.objectID);


要么

NSLog(@"object = %@", selectedObjectID);


在下一个视图控制器的viewDidLoad中,它将ID传递给下一个视图控制器,但是它将注销

object = (null)
object = Zz81bHEeJD


就像它被两次调用一样,当我尝试查询“ self.objectID”或“ selectedObjectID”时,该调用很重要

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'Cannot do a comparison query for type: (null)'


这让我很头疼。

谁能向我解释这是怎么回事,我该如何纠正?

最佳答案

加载视图控制器时,将调用viewDidLoad。在prepareForSegue中时,您知道视图控制器已经加载-因为您可以从destinationViewController获取对其的引用。这意味着viewDidLoad在将值分配给details.objectId之前执行。

您应该使用诸如viewWillAppear之类的方法访问该属性,或者在自定义设置器中触发对objectIdPreviewDetailsViewController属性的查询。

我认为extern仅用于测试,但不要使用externs

关于ios - Xcode:为什么我的NSLog被调用两次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24332373/

10-15 11:58