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