我有一个父视图和一个带文本框的模态视图。我想要做的是从模态视图传递输入到文本框中的任何内容,然后将其传递给父视图中的标签,该标签将标签更新为输入的内容。我希望这是有道理的。
我已经把头发拉了几个星期试图弄明白这一点没有运气。我发现了许多关于segues和在被推送的视图之间传递的示例和教程,但没有关于模态视图和传递回父视图。
我一直试图理解这一点,需要一个很好的例子。我有点理解为segue概念做准备,但出于某种原因,我只是想不出这个。对此有任何帮助将非常感激,你将成为我生命中的英雄大声笑。
答案 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