我知道这个问题已被多次询问,我确实阅读了有关此主题的现有帖子,但我仍然需要帮助。
我有2 UIViewControllers
- 父母和孩子。我使用UIViewController
显示孩子presentModalViewController
,如下所示:
ChildController *child =
[[ChildController alloc] initWithNibName:@"ChildView" bundle:nil];
[self presentModalViewController:child animated:YES];
[child release];
子视图有UIPickerView
。当用户从UIPickerView
中选择一个项目并点击完成后,我必须关闭模态视图并在父视图中的UITextField
上显示所选项目。
在儿童按钮中点击delegate
,我会执行以下操作:
ParentController *parent =
(ParentController *)[self.navigationController parentViewController];
[parent.myTextField setText:selectedText];
[self dismissModalViewControllerAnimated:YES];
一切正常,没有错误。但我不知道如何加载父视图,以便显示更新的UITextField
。
我试过
[parent reloadInputViews];
不起作用。请帮忙。
答案 0 :(得分:13)
代表团是要走的路。我知道有些人可能正在寻找一个更简单的解决方案,但相信我,我已经尝试了其他人,没有什么比委托更好。所以任何人都有同样的问题,请继续阅读授权并一步一步地跟进。
在你的subviewcontroller.h中 - 声明一个协议并在其中声明委托mthods。
@protocol myDelegate
-(void)clickedButton:(subviewcontroller *)subController;
@end
在你的subviewcontroller.h中,在@interface:
中id<myDelegate> delegate;
@property (nonatomic, assign) id<myDelegate> delegate;
NSString *data;
-(NSString *)getData;
在你的subviewcontroller.m中,合成myDelegate。将以下代码添加到您要通知父视图控制器的位置,以便子视图完成它应该执行的任何操作:
[delegate clickedButton:self];
然后处理getData以返回要发送到parentviewcontroller的任何数据
在parentviewcontroller.h中,导入subviewcontroller.h并使用它的委托
#import "subviewcontroller.h"
@interface parentviewcontroller : VUIViewController <myDelegate>
{}
在您的parentviewcontroller.m中,实现委托方法
- (void)clickedButton:(subviewcontroller *)subcontroller
{
NSString *myData = [subcontroller getData];
[self dimissModalViewControllerAnimated:YES];
[self reloadInputViews];
}
不要忘记内存管理!
答案 1 :(得分:0)
如果在模态视图显示期间出现低内存警告,则将卸载父视图。然后parent.myTextField
不再引用正确的文本字段,直到重新加载视图。您可以通过调用parent.view;
但是,更好的想法可能是让父视图具有可由子视图设置的String属性。然后,当父视图重新出现时,将该数据放入文本字段中,例如viewWillAppear:
内。您希望将值设置为父视图最初显示时的某个默认值。
答案 2 :(得分:0)
- (void)viewWillAppear:(BOOL)动画也没有为我调用,正好是它是一个模态视图控制器。不知道为什么。在这个应用程序的任何地方都没有错误地覆盖,并且我正在处理的其他2个应用程序也出现同样的问题。我真的认为它不起作用。
之前我曾使用过委托方法,但我认为以下方法也相当不错。
我通过向UIViewController添加一个私有类来解决这个问题,如下所示:
.h文件:
@interface UIViewController(Extras)
// returns true if this view was presented via presentModalViewController:animated:, false otherwise.
@property(readonly) BOOL isModal;
// Just like the regular dismissModalViewController, but actually calls viewWillAppear: on the parent, which hasn't been working for me, ever, for modal dialogs.
- (void)dismissModal: (BOOL) animated;
@end
和.m文件:
@implementation UIView(Extras)
-(BOOL) isModal
{
return self == self.parentViewController.modalViewController;
}
- (void)dismissModal: (BOOL) animated
{
[self.parentViewController viewWillAppear: animated];
[self dismissModalViewControllerAnimated: animated];
}
@end
当我想要关闭对话框时,我现在可以这样调用:
// If presented as a modal view, dismiss yourself.
if(self.isModal)
[self dismissModal: YES];
现在正确调用viewWillAppear。
是的,我正在捐赠奖励'isModal'属性,以便模态视图可以告诉它是如何呈现的,并适当地解雇。