在情节提要中以模态转场传递数据?

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
}