在情节提要中以模态转场传递数据?
Pass data in modal segue in storyboard?
我真正的问题是我想通过 modal segue.
将数据从 childViewController 传递到故事板中的 parentViewController
代码
parentViewController.h
@property (strong, nonatomic)NSMutableArray *address;
childViewController.m
parentViewController *parent=(parentViewController *)self.presentingViewController;
post.address=@"Hello World";
此代码抛出 异常 就像
Terminating app due to uncaught exception
'NSInvalidArgumentException', reason: '-[MainTabbarViewController
setAddress:]: unrecognized selector sent to instance 0x7fa070e6b910'
故事板结构
TabbarController->NavigationController->parentViewController->childViewController
提前致谢。
您不能像这样将数据传回父视图控制器。委托是实现这一点的最佳方式。
请查看下面的link,其中有详细解释。
passing-data-between-view-controllers
无法获得对创建您的转场的引用。您可以在目标控制器中创建一个 属性(在我的示例中为 sourceVC),并在 prepareForSegue 方法(在源视图控制器中)中将 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"];
}
}
正确的方法是使用委托
在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
}
我真正的问题是我想通过 modal segue.
将数据从 childViewController 传递到故事板中的 parentViewController代码
parentViewController.h
@property (strong, nonatomic)NSMutableArray *address;
childViewController.m
parentViewController *parent=(parentViewController *)self.presentingViewController;
post.address=@"Hello World";
此代码抛出 异常 就像
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MainTabbarViewController setAddress:]: unrecognized selector sent to instance 0x7fa070e6b910'
故事板结构
TabbarController->NavigationController->parentViewController->childViewController
提前致谢。
您不能像这样将数据传回父视图控制器。委托是实现这一点的最佳方式。 请查看下面的link,其中有详细解释。
passing-data-between-view-controllers
无法获得对创建您的转场的引用。您可以在目标控制器中创建一个 属性(在我的示例中为 sourceVC),并在 prepareForSegue 方法(在源视图控制器中)中将 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"];
}
}
正确的方法是使用委托
在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
}