2

我知道这个问题已经被问过好几次了,我确实阅读了关于这个主题的现有帖子,但我仍然需要帮助。

我有 2 UIViewControllers- 父母和孩子。UIViewController我使用presentModalViewController如下显示孩子:

ChildController *child = 
 [[ChildController alloc] initWithNibName:@"ChildView" bundle:nil];
[self presentModalViewController:child animated:YES];
[child release];

子视图有一个UIPickerView. 当用户从中选择一个项目UIPickerView并单击完成时,我必须关闭模式视图并UITextField在父视图中的 a 上显示所选项目。

在孩子的按钮 clickdelegate中,我执行以下操作:

ParentController *parent = 
 (ParentController *)[self.navigationController parentViewController];
[parent.myTextField setText:selectedText];
[self dismissModalViewControllerAnimated:YES];

一切正常,没有错误。但我不知道如何加载父视图以显示更新后的UITextField.

我试过了

[parent reloadInputViews];

不工作。请帮忙。

4

3 回答 3

13

授权是要走的路。我知道有些人可能正在寻找更简单的解决方案,但相信我,我已经尝试过其他人,没有什么比委派更好的了。所以任何有同样问题的人,去阅读委托并一步一步地遵循它。

在您的 subviewcontroller.h - 声明一个协议并在其中声明委托方法。

@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];
 }

不要忘记内存管理!

于 2010-03-17T18:37:09.980 回答
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”属性,以便模态视图可以告诉它是如何呈现的,并适当地关闭它自己。

于 2010-11-25T20:28:51.593 回答
0

如果在模态视图显示期间出现内存不足警告,则父视图将被卸载。然后parent.myTextField在重新加载视图之前不再引用正确的文本字段。您可以通过调用强制重新加载视图parent.view;

但是,更好的想法可能是让父视图具有可由子视图设置的 String 属性。然后,当父视图重新出现时,将该数据放入文本字​​段中,viewWillAppear:例如里面。您希望将值设置为父视图最初显示时的某个默认值。

于 2010-03-09T22:51:05.333 回答