我真正的问题是我想通过模态segue 将数据从childViewController传递到storyboard中的parentViewController。
代码
parentViewController.h
@property (strong, nonatomic)NSMutableArray *address;
childViewController.m
parentViewController *parent=(parentViewController *)self.presentingViewController;
post.address=@"Hello World";
此代码抛出异常,如
由于未捕获的异常而终止应用 ' NSInvalidArgumentException',原因:' - [MainTabbarViewController setAddress:]:无法识别的选择器发送到实例0x7fa070e6b910'
故事板结构
TabbarController-> NavigationController-> parentViewController-> childViewController
先谢谢你。
答案 0 :(得分:2)
正确的方法是使用委托
ChildViewController.h
中的
@protocol ChildDelegate
- (void)postAddress:(NSString *)address;
@end
@interface ChildViewController
@property (nonAtomic, assign) id<ChildDelegate> delegate;
@end
ChildViewController.m
中的
[self.delegate postAddress:address];
ParentViewController.h
中的
@interface ParentViewController <ChildDelegate>
@end
ParentViewController.m
中的
// presenting childViewController
- (void)presentChildViewController {
ChildViewController *childViewController = [[ChildViewController alloc]init];
childViewController.delegate = self;
[self presentViewController:childViewController animated:YES completion:nil];
}
// delegate method
- (void)postAddress:(NSString *)address{
// add you code here
}
答案 1 :(得分:1)
您无法像这样将数据传回父视图控制器。授权是实现这一目标的最佳方式。 请查看以下链接,详细说明。
答案 2 :(得分:0)
无法获得创建您的segue的引用。您可以在目标控制器中创建一个属性(在我的示例中为sourceVC),并在prepareForSegue方法(在源视图控制器中)中为self指定self:
[(ChildViewController *)segue.destinationViewController sourceVC] = self;
无论如何,我认为使用代表是一个更好的解决方案。
*在ChildViewController.h *
@protocol ChildDelegate <NSObject>
- (void)postAddress:(NSString*)ad;
@end
@interface ChildViewController : UIViewController
@property (weak, nonatomic) id <ChildDelegate> delegate;
@end
*在ParentViewController.h *
@interface ParentViewController : UIViewController <ChildDelegate>
@end
*在ParentViewController.m *
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
ChildViewController *vc = [segue destinationViewController];
vc.delegate = self;
}
*在ChildViewController.m *
- (void)changeAddress:(NSString*)ad
{
if ([self.delegate respondsToSelector:@selector(postAddress:)])
{
// Tell the delegate something.
[self.delegate postAddress:@"New Address"];
}
}