【问题标题】:Programmatically accessing subviews of UIView added in Interface Builder以编程方式访问在 Interface Builder 中添加的 UIView 的子视图
【发布时间】:2010-10-14 15:30:24
【问题描述】:

我有一个 nib 文件,其中有一个视图,其中包含一个背景图像、一个按钮和另一个覆盖全屏的图像(阴影),需要移到前面。 在视图上,我正在创建子视图,在创建这些子视图并使用 [self addView] 添加它们之后,我需要将阴影图像移到前面。

我目前正在使用 tag 属性来查找该视图,但我认为可能有更好的方法,通过使用某个名称识别我在 Interface Builder 中添加的子视图。

我尝试添加一个 IBOutlet 以将子视图与其父视图连接起来,但它不起作用(而且没有任何意义,因为子视图已经以某种方式连接到其父视图)。

【问题讨论】:

    标签: ios uiview iboutlet


    【解决方案1】:

    IBOutlets 方式应该可行,并且可能是最好的方式。在 .h 文件中声明它们之后,确保在 Interface Builder 中建立了正确的连接。

    【讨论】:

    • 不走运。我在父视图上添加了一个 IBOutlet,并连接了它的子视图,但是当我尝试访问它时,我得到的是 nil 而不是对象。我尝试了一个属性和一个变量,运气都一样。
    • 您的 IBOutlet 声明在哪里?如果您使用每个控制器一个 nib 的比喻,另一种方法是在文件所有者(控制器)中声明 IBOutlet,然后确保在文件所有者中声明的出口链接到 IB 中的项目。我就是这样做的。
    • 我在 UIView 子类上声明插座,我尝试连接其他视图,而不是在控制器中。
    • 如果它在视图子类中,您需要将代码放入-awakeFromNib,而不是viewDidLoad,因为这是一个视图控制器方法。 -initWithCoder: 也将不起作用,因为那时还没有建立网点。
    【解决方案2】:

    iPhone 会延迟加载视图控制器。 nib 可能没有加载到 initWithCoder 或 Kendall 指定的任何 init 方法中。

    viewDidLoad 是从 nib 访问任何内容的首选位置,如果您想在视图显示之前访问它们。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      您在什么时候尝试访问子视图?如果您在 ViewController 的 init 中尝试,IBOutlets 将为 nil。您可以使用它们的第一个方法可能是 viewDidLoad。

      这样做有意义的原因是 IBOutlets 只是指向某个组件的直接指针,即使它们已经是其他东西的子视图。只是节省了很多打猎。

      【讨论】:

      • 我正在尝试通过从 initWithCoder 调用的方法访问它们:在视图中。
      • 尝试使用 viewDidLoad 代替 - 基本上它在做同样的事情,只会在视图加载时调用一次。
      【解决方案4】:

      只要您使用 viewWithTag: 方法,使用标签是定位特定视图的一种非常有效的方法。如果您已经在使用标签,则无需更改为 IBOutlets,除非您只是不喜欢调用 viewWithTag:。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        • 2017-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-15
        • 1970-01-01
        相关资源
        最近更新 更多