为简洁而编辑:
子视图如何在其superview及其superview的视图控制器中访问属性?足够简单,可以沿着链接进行访问。我们怎么回去?
原文(详细)帖子:
我试图解决的直接问题是简化某种复杂观点的“诞生”。大图与Nibs有关,以及在视图加载时如何重构超出普通初始值设定项的子类(特别是UIView)。
我有一些自定义UIViews - 我的viewcontroller视图的子视图的子视图。当我特别实例化这些视图时,他们需要引用View Controller的一些属性(NSNumberFormatter,& NSDictionary)。
Currenty我使用一种方法来实例化它们:
- (id)initWithFrame:(CGRect)frame items:(NSDictionary *)dictionary forEditingMode:(EditingMode)mode
我正在尝试将它们移到Nib中,让它们重新构建并遇到基本的设计问题。一个是我认为我只限于initWithFrame作为默认的初始化程序?!?如果是这样,这些对象如何查看父视图控制器并获取对字典和其他一些属性的引用?
我是否可以在initWithFrame中调用方法(类似于检索UIApplication委托的方法)但是允许子视图将方法发送到它的父视图和/或控制器?
发送MVC警察,我确定我打破了某些事情......
答案 0 :(得分:1)
它应该反过来工作。
视图仅包含控件(文本字段等)。数据存在于模型中,视图/窗口控制器调解,访问和设置视图控件值,与模型同步。
好的,有时您可能需要在控制器和视图之间共享一个字典。然后在视图中创建一个字典属性,并将其设置在nib所有者的awakeFromNib方法中。
答案 1 :(得分:0)
您可以设置连接到视图的超级视图或视图控制器的插座,并在awakeFromNib
中提取信息。您需要使用awakeFromNib
而不是init*
,因为在此之前不会创建连接。
仅供参考,如果您通过笔尖进行实例化,则您指定的初始化程序为initWithCoder:
,而不是initWithFrame:
(但不要同时使用它)。
答案 2 :(得分:0)
您可能应该在加载nib后手动通过视图控制器执行此操作。这意味着您必须设置共享字典 AFTER 视图已初始化。你可以这样做:
@interface MyViewController : UIViewController {
IBOutlet MyView* view1;
IBOutlet MyView* view2;
IBOutlet MyView* view3;
}
@end
@implementation MyViewController
-(void) viewDidLoad;
{
NSDictionary* sharedDict = //make the shared dictionary here;
view1.sharedDict = sharedDict;
view2.sharedDict = sharedDict;
view3.sharedDict = sharedDict;
}
@end