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;
我正在代码中启动模态视图控制器并希望传递数据对象。我在目标 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;