Xcode:为什么我的传递变量"(null)"

时间:2014-06-25 18:55:39

标签: ios objective-c xcode

场景=有三个视图控制器。前两个视图控制器有一个表视图,允许用户选择一行数据,然后它将切换到第三个视图控制器,它将显示有关他们所选行的详细信息。在didSelectRowAtIndexPath方法中," objectID"设置为一个名为" selectedObjectID"的变量。需要传递给下一个视图控制器以查询objectID。关键是要了解两者前两个视图控制器使用另一个视图控制器来显示细节。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    PFObject *objectID = [collectionArray objectAtIndex:indexPath.row];
    selectedObjectID = [objectID objectId];

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

    [self performSegueWithIdentifier:@"details" sender:self];

}


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

    if ([segue.identifier  isEqual: @"details"]) {

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

        DetailsViewController *details = [segue destinationViewController];
        details.selectedObjectID = selectedObjectID;
    }
}

注意 第一个视图控制器完全按照它应该的方式工作。用户选择一行并设置objectID并将其传递给下一个视图控制器。一切都很完美。

问题=我在第一个VC中执行完全相同的操作(并且确切地说我的意思是复制和粘贴)作为第二个VC,但第二个没有像第一个那样将变量传递给详细信息视图控制器。

我已将NSLogs放在前两个视图控制器的didSelectRowAtIndexPath和prepareForSegue方法中以及详细信息视图控制器的viewDidLoad中。当我说明它记录给我的时候,请耐心等待。

日志结果如下

第一视图控制器

didSelectRowAtIndexPath = Kv5rL3Usa6
prepareForSegue = Kv5rL3Usa6
viewDidLoad = Kv5rL3Usa6

第二视图控制器

prepareForSegue = (null)
viewDidLoad = (null)
didSelectRowAtIndexPath = Zz81bHEeJD

最后调用didSelectRowAtIndexPath。当你必须从get go中选择要调用segue的行时,怎么会发生这种情况呢?这对我没有任何意义。请帮忙。

1 个答案:

答案 0 :(得分:0)

我建议您记录所涉及对象的地址。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    PFObject *objectID = [collectionArray objectAtIndex:indexPath.row];
    selectedObjectID = [objectID objectId];

    NSLog(@"didSelectRowAtIndexPath = %@ (self=%@)", selectedObjectID, self);

    [self performSegueWithIdentifier:@"details" sender:self];

    NSLog(@"still didSelectRowAtIndexPath. self=%@)", self);
}


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

    if ([segue.identifier  isEqual: @"details"]) {

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

        DetailsViewController *details = [segue destinationViewController];
        details.selectedObjectID = selectedObjectID;

        NSLog(@"still prepareForSegue. self=%@; details=%@", self, details);
    }
}

并在-viewDidLoad中也以同样的方式记录self ...

self中的-viewDidLoad应该等于prepareForSegue中的details ...我怀疑这是问题......