UIViewController不在视图之间传递数据

时间:2014-08-13 06:23:38

标签: ios objective-c cocoa-touch ios7

我正在尝试在故事板中的UIViewControllers之间传递一些数据。我在下面有一些代码来传递数据。当我记录我在原始屏幕上保存的字符串时,它很好,但当我转到UIDetailViewController时,go返回(null)。我的问题是什么?

原始视图控制器:

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

    if (tableView==_countryTableView) {
        if (indexPath.section==0) {
            AthleteDataTransfer *dataTransfer = [[AthleteDataTransfer alloc] init];
            dataTransfer.name=@"Yo";
            dataTransfer.dob=@"01/01/2000";
            dataTransfer.description=@"I am awesome";
            dataTransfer.hometown=@"Launy";

            NSLog(@"%@", dataTransfer.name);

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

        }

    }
}

详情视图控制器:

AthleteDataTransfer *dataTransfer = [[AthleteDataTransfer alloc] init];
        _name.text=dataTransfer.name;
        dataTransfer.dob=_dob.text;
        dataTransfer.description=_description.text;
        dataTransfer.hometown=_hometown.text;

        NSLog(@"%@", dataTransfer.name);

4 个答案:

答案 0 :(得分:5)

不是在tableView didSelectRowAtIndexPath 中传递数据,而是传递 prepareForSegue 方法中的数据。

像这样:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showDetail"]) {
        AthleteDataTransfer *dataTransfer = (AthleteDataTransfer *)[segue destinationViewController];
        dataTransfer.name=@"Yo";
        dataTransfer.dob=@"01/01/2000";
        dataTransfer.description=@"I am awesome";
        dataTransfer.hometown=@"Launy";
    }
}

答案 1 :(得分:3)

您应该使用prepareForSegue方法来完成此任务。 如果您从此ViewController中有多个segues,则可以使用segue.Identifier来区分

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

    if(segue.identifier==@"yoursegueidentitifer")
     {
       DetailedViewController *detailController = [segue destinationViewController];
       detailController.nameoftextview.text =self.textViewName.text;
    }
}

答案 2 :(得分:3)

正如其他答案所示,您应该使用prepareForSegue方法传递数据。我不打算在这里重复相同的代码。我想指出一件你不想在detailViewController中再次创建DetailViewController的事情,如下所示

AthleteDataTransfer *dataTransfer = [[AthleteDataTransfer alloc] init]; //  This is wrong and not required at all 
NSLog(@"%@", dataTransfer.name);

相反,您应该使用self来引用当前控制器

NSLog(@"%@", self.name); // This would be enough

答案 3 :(得分:1)

要将文本数据发布到目标View Controller,您可以像这样使用prepareForSegue方法。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    DestinationViewController *destController = [segue destinationViewController];
    destController._yourTextView.text == _yourText.text;
    }
}

在这里,DesctinationViewController是您希望传递值的控制器,在下一步中,您可以使用其对象和在该控制器上声明的属性来分配值。

由于您使用的是performSegueWithIdentifier,因此会在prepareForSegue执行后自动调用performSegueWithIdentifier,这将显示目标视图控制器。