我正在代码中启动一个模态视图控制器,并希望传递一个数据对象。 我已经在目标 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];
}
您应该使用 prepareForSegue 情节提要委托。
首先,通过如下所示的 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;
是的,我认为您的代码有效,请在其他地方查找错误。
但是,仍然需要确保两件事:
gotoStoryboard
在用户操作后实现。- 在情节提要中,
moreInfoVC
具有标识符moreInfo
。
在发送到目标控制器之前,首先检查它是否_product包含某些内容。
在我们的代码中,我们倾向于让故事板定义 segue,然后在按钮操作中执行它:
performSegueWithIdentifier("Segue id", sender: self)
或者直接将 segue 链接到故事板中的按钮。
然后我们像这样覆盖prepareForSegue
:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Segue id" {
let destinationController = segue.destinationViewController as? MyControllerClass
destinationController?.someProp = aValue
}
}
我们很少像您的示例那样手动从情节提要实例化视图控制器。如果你没有运气,你可以尝试这种方法。