【问题标题】:How to reference views programmatically without using IBOutlet如何在不使用 IBOutlet 的情况下以编程方式引用视图
【发布时间】:2012-09-06 04:03:09
【问题描述】:

我是 iOS 编程新手,我正在使用 XCode 学习故事板。我的问题是

我已经添加了我想要使用 IB 的视图,但我不想让它们在 IB 中使用 Ctrl+Drag 连接到我的 ViewController,而是以编程方式执行相同的操作。 我看过建议在代码中创建视图实例并使用 addSubView() 添加它们(通过设置框架)的帖子。但我不想在代码中硬编码我的框架和大小,我更喜欢 IB。我只需要在需要时参考它们。

在 android 中,我们可以通过布局 XML 上的 getIdByName() 来做同样的事情。我正在寻找类似的东西。

谢谢

【问题讨论】:

    标签: ios uiviewcontroller interface-builder uistoryboard


    【解决方案1】:

    在 IB 中,您可以设置视图的 Tag 属性,然后使用以下代码在代码中引用它:

    int buttonTagNumber = 2;
    UIButton *myTaggedButton = (UIButton *)[self.view viewWithTag:buttonTagNumber];
    

    标签只是一个int,您可以拥有任意数量的标签。请注意,如果您在一个层次结构中的 2 个不同视图上具有相同的标签,则行为是未定义的,它将抓取它找到的第一个。

    【讨论】:

    • 谢谢,这行得通。但是我仍然需要在 ViewController.h 中定义一个 IBOutlet。如果我删除它,我会得到 [
    • 啊,您需要进入 Interface Builder 并删除您可能与插座建立的连接。只需点击插座名称旁边的叉号并清除连接,即可移除插座而不会出现键值编码合规性错误。
    【解决方案2】:

    你可以像这样向下钻取:

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"myStoryboard" bundle:nil];
    UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
        UIView *view = [vc.view viewWithTag:1];
    

    【讨论】:

    • 您好,如果您需要在情节提要中引用视图控制器,您的回答会很好。这不是我想要的,我需要引用viewcontroller中已经存在的视图。
    • 那么 viewWithTag 选项可能是您的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    相关资源
    最近更新 更多