UIViewController parentViewController访问属性

时间:2010-03-09 21:25:38

标签: objective-c uiviewcontroller parentviewcontroller

我知道这个问题已被多次询问,我确实阅读了有关此主题的现有帖子,但我仍然需要帮助。

我有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];

不起作用。请帮忙。

3 个答案:

答案 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'属性,以便模态视图可以告诉它是如何呈现的,并适当地解雇。