如何在不使用IBOutlet的情况下以编程方式引用视图

3
我是iOS编程的新手,正在使用XCode学习storyboards。我的问题是,我已经使用IB添加了所需的视图,但是我不想使用IB中的Ctrl+拖动将它们连接到我的ViewController上,而是希望通过编程实现同样的功能。我看到有人建议在代码中创建视图实例,并使用addSubView()方法添加它们(通过设置frame)。但是我不想在代码中硬编码我的视图大小和位置,我更喜欢使用IB来完成这个任务。我只需要在需要时引用它们即可。在Android中,我们可以通过在布局XML中使用getIdByName()来实现类似的功能。我正在寻找类似的东西。谢谢。
2个回答

5

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

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

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


谢谢,这个方法可行。但是我仍然需要在我的ViewController.h文件中定义一个IBOutlet。如果我删除它,就会出现[<ViewController setValue:forUndefinedKey:];错误。 - 2ndlife
啊,你需要进入Interface Builder并删除可能已经连接到outlet的连接。只需单击outlet名称旁边的叉号并清除连接,然后您就可以删除outlet而不会出现键值编码兼容性错误。 - user244343

0
你可以像这样进行钻取:
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"myStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
    UIView *view = [vc.view viewWithTag:1];

你好,如果你需要在Storyboard中引用ViewController,那么你的回答是正确的。但这不是我想要的,我需要引用已经在ViewController中的视图。 - 2ndlife
如果您遇到了这种情况,那么viewWithTag选项可能是解决方案。 - nooitaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接