在故事板中以模态segue传递数据?

时间:2015-06-17 07:35:55

标签: ios objective-c iphone storyboard modalviewcontroller

我真正的问题是我想通过模态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

先谢谢你。

3 个答案:

答案 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)

您无法像这样将数据传回父视图控制器。授权是实现这一目标的最佳方式。 请查看以下链接,详细说明。

passing-data-between-view-controllers

答案 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"];
    }
}