iOS/objective-c: 将对象传递给新的视图控制器

iOS/objective-c: Pass object to new view controller

我正在代码中启动模态视图控制器并希望传递数据对象。我在目标 VC 上为对象创建了一个 属性。新 VC 启动正常但未获取数据对象。下面的代码有什么问题吗?如果不是,我将不得不在其他地方寻找错误,但想知道这是否是传递数据对象的正确方法。

//in header file of destination VC
@property (nonatomic, strong) Product *product;

//in .m file of starting VC
- (void) gotoStoryboard {
    UIStoryboard *storyBoard = self.storyboard;
    moreInfoVC *infoVC =
    [storyBoard instantiateViewControllerWithIdentifier:@"moreInfo"];
      infoVC.product = _product;//IS THIS ADEQUATE TO PASS DATA OBJECT?
     UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController: infoVC];
    [self presentModalViewController:nav animated:YES];
}

是的,我认为您的代码有效,请在其他地方寻找错误。
但仍有两件事需要确保:

  • gotoStoryboard在用户操作后实现。
  • 在 StoryBoard 中,moreInfoVC 具有标识符 moreInfo

首先检查_product它是否包含某些东西,然后再发送到目标控制器。

在我们的代码中,我们倾向于让故事板定义 segue,然后在按钮操作中执行它:

performSegueWithIdentifier("Segue id", sender: self)

或者直接 link 转至情节提要中的按钮。

然后我们像这样覆盖prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "Segue id" {
        let destinationController = segue.destinationViewController as? MyControllerClass
        destinationController?.someProp = aValue
    }
}

我们很少像您的示例那样从情节提要中手动实例化视图控制器。如果你运气不好,你可以试试这个方法。

您应该使用 prepareForSegue Storyboard 委托。

首先你通过像这样的 segue 标识符调用视图移动到下一个视图:

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

然后将此代码添加到与上述代码相同的 .m 文件中。这会准备下一个视图,其中包含您希望它拥有的数据或项目。

-(void)prepareForSegue:(UIStoryboard *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"YourSegueIdentifier"]) {
        MoreInfoViewController * moreInfoVC = segue.destinationViewController;
        // This is how you will pass the object or data you want for the next view
        moreInfoVC.aStringToPass = @"I am passing this string";
        moreInfoVc.myCustomObjectToPass = theCustomObject;
    }
}

然后您必须将对象作为 属性 在您要使用 segue 的视图的 .h 文件中。

// MoreInfoViewController.h
@property NSString * aStringToPass;
@property CustomObject * myCustomObjectToPass;