Objective c UIViewController父视图控制器访问属性

Objective c UIViewController父视图控制器访问属性,objective-c,uiviewcontroller,parentviewcontroller,Objective C,Uiviewcontroller,Parentviewcontroller,我知道这个问题已经被问过好几次了,我也读过关于这个话题的帖子,但我仍然需要帮助 我有两个UIViewControllers——父控制器和子控制器。我使用presentModalViewController显示子视图控制器,如下所示: ChildController *child = [[ChildController alloc] initWithNibName:@"ChildView" bundle:nil]; [self presentModalViewController:child

我知道这个问题已经被问过好几次了,我也读过关于这个话题的帖子,但我仍然需要帮助

我有两个
UIViewControllers
——父控制器和子控制器。我使用presentModalViewController显示子视图控制器,如下所示:

ChildController *child = 
 [[ChildController alloc] initWithNibName:@"ChildView" bundle:nil];
[self presentModalViewController:child animated:YES];
[child release];
子视图有一个
UIPickerView
。当用户从
UIPickerView
中选择一个项目并单击“完成”时,我必须取消模式视图,并在父视图中的
UITextField
上显示所选项目

在孩子的按钮中,单击代理,我执行以下操作:

ParentController *parent = 
 (ParentController *)[self.navigationController parentViewController];
[parent.myTextField setText:selectedText];
[self dismissModalViewControllerAnimated:YES];
一切正常。但是我不知道如何加载父视图,以便它显示更新的
UITextField

我试过了

[parent reloadInputViews];

这不管用。请帮忙

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


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

委派是一种方法。我知道有些人可能在寻求更简单的解决方案,但相信我,我也尝试过其他人,没有什么比授权更有效的了。所以,任何有同样问题的人,都可以阅读委托书并一步一步地跟进

在子ViewController.h中-声明协议并在其中声明委托方法

@protocol myDelegate
 -(void)clickedButton:(subviewcontroller *)subController;
@end
在子ViewController.h中的@interface内:

id<myDelegate> delegate;
@property (nonatomic, assign) id<myDelegate> delegate;    
NSString *data;
-(NSString *)getData;
然后处理getData以返回要发送到parentviewcontroller的任何数据

在parentviewcontroller.h中,导入subviewcontroller.h并使用它的委托

 #import "subviewcontroller.h"
 @interface parentviewcontroller : VUIViewController <myDelegate>
 {}
别忘了内存管理

-(void)viewwillbeen:(BOOL)animated也不会为我调用,确切地说,当它是模态视图控制器时。不知道为什么。没有错误地覆盖此应用程序中的任何位置,我正在处理的其他两个应用程序也出现了相同的问题。我真的认为它不管用

我以前使用过委托方法,但我认为下面的方法也很好

我通过向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];
现在VIEWWILLEXPEND已正确调用


是的,我捐赠了一个额外的“isModal”属性,这样模态视图就可以知道它是如何呈现的,并且可以适当地解除它自己。

ViewWillAppeal在解除子模态时不会触发。“完成”按钮位于子视图中,我从中获取选择器视图的选定文本,然后关闭模式。父对象就在那里,不必重新出现。我猜这就是为什么它不会激发ViewWillEmerge的原因。如果你做的每件事都是正确的,按照框架应该使用的方式使用它,那么应该调用ViewWillEmerge。你确定你在正确的类中重写了正确的方法吗?这就是Effin Epic answer dude。谢谢!:-)
@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];