如何将NSString从模态视图传递到父视图

时间:2012-06-06 15:07:48

标签: nsstring modalviewcontroller segue parentviewcontroller

我有一个父视图和一个带文本框的模态视图。我想要做的是从模态视图传递输入到文本框中的任何内容,然后将其传递给父视图中的标签,该标签将标签更新为输入的内容。我希望这是有道理的。

我已经把头发拉了几个星期试图弄明白这一点没有运气。我发现了许多关于segues和在被推送的视图之间传递的示例和教程,但没有关于模态视图和传递回父视图。

我一直试图理解这一点,需要一个很好的例子。我有点理解为segue概念做准备,但出于某种原因,我只是想不出这个。对此有任何帮助将非常感激,你将成为我生命中的英雄大声笑。

1 个答案:

答案 0 :(得分:0)

在我使用segues的项目中,我就是这样做的(注意我是iOS的新手,所以可能有“更好”的方式,这对于iOS老手来说可能是显而易见的):

简短版本:在模态视图控制器的.h文件中定义回调协议。当模态视图控制器关闭时,它会检查演示者是否实现该协议并调用这些方法来传递数据。

就像你说的那样,让我们​​说你的模态视图控制器只是从用户收集一个字符串值,然后单击确定或取消。该课程可能如下所示:

@interface MyModalViewController : UIViewController
...
@end

我建议你在同一个标​​题中添加这样的协议:

@protocol MyModalViewControllerCallback
-(void) userCancelledMyModalViewController:(MyModalViewController*)vc;
-(void) userAcceptedMyModalViewController:(MyModalViewController*)vc
                                withInput:(NSString*)s;
@end

然后在MyModalViewController.m中添加viewDidDisappear,代码与此类似:

-(void) viewDidDisappear:(BOOL)animated {
    UIViewController* presenter = self.presentingViewController;
    // If the presenter is a UINavigationController then we assume that we're
    // notifying whichever UIViewController is on the top of the stack.
    if ([presenter isKindOfClass:[UINavigationController class]]) {
        presenter = [(UINavigationController*)presenter topViewController];
    }
    if ([presenter conformsToProtocol:@protocol(MyModalViewControllerCallback)]) {
        // Assumes the presence of an "accepted" ivar that knows whether they
        // accepted or cancelled, and a "data" ivar that has the data that the
        // user entered.
        if (accepted) {
            [presenter userAcceptedMyModalViewController:self withInput:data];
        }
        else {
            [presenter userCancelledMyModalViewController:self];
        }
    }
    [super viewDidDisappear:animated];
}

最后在父视图中,您实现了新的@protocol,例如在.h

@interface MyParentViewController : UIViewController <MyModalViewControllerCallback>
...
@end

.m

@implementation MyParentViewController
...
-(void) userCancelledMyModalViewController:(MyModalViewController*)vc {
    // Update the text field with something like "They clicked cancel!"
}
-(void) userAcceptedMyModalViewController:(MyModalViewController*)vc
                                withInput:(NSString*)s {
    // Update the text field with the value in s
}
...
@end