【问题标题】:Nib objects (subviews) accessing properties in ViewControllerNib 对象(子视图)访问 ViewController 中的属性
【发布时间】:2010-11-11 20:04:06
【问题描述】:

为简洁而编辑:

子视图如何访问其父视图和其父视图的视图控制器中的属性? 很容易进入链条。我们怎么回去?

原始(详细)帖子:

我要解决的直接问题是简化一个有点复杂的视图的“诞生”。大图与 Nibs 以及如何在视图加载时重组具有超出普通初始化程序的子类(特别是 UIView)。

我有一些自定义 UIViews - 我的 viewcontroller 视图的子视图的子视图。当我特别实例化这些视图时,它们需要对视图控制器的某些属性(NSNumberFormatter 和 NSDictionary)的引用。

目前我使用一种方法来实例化它们:

- (id)initWithFrame:(CGRect)frame items:(NSDictionary *)dictionary forEditingMode:(EditingMode)mode

我正在尝试将它们移入笔尖,让它们自行重组并遇到基本的设计问题。一个是我认为我仅限于 initWithFrame 作为默认初始化程序?!?如果是这样,这些对象如何查看父视图控制器并获取对字典和其他一些属性的引用?

是否有我可以在 initWithFrame 中调用的方法(类似于检索 UIApplication 委托的方法)但允许子视图将方法发送到它的父视图和/或控制器?

派 MVC 警察来,我确定我在破坏什么......

【问题讨论】:

    标签: iphone cocoa cocoa-touch


    【解决方案1】:

    它应该反过来工作。

    视图仅包含控件(文本字段等)。数据存在于 模型 中,视图/窗口控制器进行调解,访问和设置视图控件值,与模型同步。

    好的,有时您可能需要在控制器和视图之间共享字典。然后在视图中创建字典属性,并在 nib 所有者的 awakeFromNib 方法中设置。

    【讨论】:

      【解决方案2】:

      您可以设置连接到视图的超级视图或视图控制器的出口,并在awakeFromNib 中提取信息。您需要使用awakeFromNib 而不是init*,因为在此之前不会创建连接。

      仅供参考,如果您通过 Nib 实例化,您指定的初始化程序是 initWithCoder:,而不是 initWithFrame:(但不要用于此)。

      【讨论】:

      • 所以您是说在这些子视图中放置一个指向超级视图或视图控制器的 IBOutlet?我以前没遇到过……这很常见吗?
      • 本质上是委托模式。您给子视图一个名为delegate 的出口和一个委托协议(从历史上看,这将是非正式的,尽管现在您可以使用带有可选方法的正式协议)。然后你让superview符合协议。最后,您将其设置为委托,无论是在 IB 中还是使用访问者消息。
      • 是的,就像彼得说的那样,你的视图控制器本质上变成了子视图的代表。确保将其设为 assign 属性,否则您将进入保留周期。
      【解决方案3】:

      您可能应该在加载 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-14
        • 1970-01-01
        • 2012-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多