【问题标题】:UIViewController not passing data between viewsUIViewController 不在视图之间传递数据
【发布时间】:2014-10-06 09:52:09
【问题描述】:

我正在尝试在情节提要中的 UIViewController 之间传递一些数据。我在下面有一些代码来传递数据。当我将要保存在原始屏幕上的字符串记录下来时,这很好,但是当我转到UIDetailViewController 时,转到返回(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);

【问题讨论】:

  • 当您从 tableview 的 didselect 方法转到详细视图控制器时。你在细节视图控制器的 viewDidLoad 上的 NSLog 中得到了什么?
  • 我收到一条(空)消息
  • 您是否为这些对象定义了属性并合成了它们?
  • 您创建的标签是 IBOutlet 还是您在 viewdidload 方法上分配它们?

标签: ios objective-c cocoa-touch ios7


【解决方案1】:

正如此处其他答案所建议的,您应该在 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

【讨论】:

    【解决方案2】:

    在tableViews 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";
        }
    }
    

    【讨论】:

    • 仍然返回(空)
    • 在detail view controller中不需要重新分配对象,是不是又分配了?
    • 当你写语句时,AthleteDataTransfer *dataTransfer = [[AthleteDataTransfer alloc] init];它实际上生成了一个新的 AthleteDataTransfer 对象,而不是尝试使用传递的对象。
    【解决方案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;
        }
    }
    

    【讨论】:

    • 干杯,如果我想从 tableView 触发 segue 并且每行都有唯一的数据,我该怎么办??
    • 声明一些变量以在您的 viewController .h 中保存数据,当在 tableView 中选择表行时:selectrowForIndexPath:将数据保存在这些变量中以及当您在 prepareForSegue 中执行 segue 时:发件人:您可以访问来自这些变量的数据并将它们与 segue 一起发送到您的目标视图
    • 非常感谢@SebOH,Enjoy,Happycoding
    【解决方案4】:

    要将文本数据发布到目标视图控制器,您可以像这样使用prepareForSegue 方法。

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 2011-07-13
      • 2022-01-07
      • 2011-12-07
      相关资源
      最近更新 更多