iOS - 如何在视图控制器中引用视图?

5

从Android的背景来看,每个UI元素(即“小部件”)都有一个ID。例如,userNameInputText可以是映射到特定文本字段的ID。那么在iOS中的类比是什么呢?

在Xcode中,我在我的故事板中定义视图,然后将它们ctrl+拖动到我的ViewController类中。这使我能够设置侦听器等。然而,似乎有些东西被遮蔽了。侦听器如何引用回特定的视图?在Android中,这很明显,因为您必须显式提供元素的ID。


1
你可以为视图分配一个“标签”号码,并通过标签定位所需的视图,但创建一个@IBOutlet属性并将其链接到适当的UI元素要简单得多且更有效率。 - Paulw11
1
当你编写代码时,你知道需要访问哪个UI元素,然后就可以直接访问它。正如我所说,你可以在“tag”属性中分配一个ID,但通常不需要这样做。 - Paulw11
1
这是一种你尽量不用担心的魔法。从C#转过来,XCode的许多方面看起来都有些笨重 - 特别是连接视图和事件处理程序。不过,仍然有很多优点。 - Michael
那么作为程序员,我如何知道userNameInputText引用的是哪个视图?比如说,如果我正在使用一个新的代码库。 - another_user10293412
1
你需要在 InterfaceBuilder 中创建与视图控制器中 IBOutlet 相对应的链接。该链接会被记录在 XML 文件中,但你不需要担心它。当场景从故事板实例化时,这些项目会连接到视图控制器实例中的属性。如果你在故事板中点击该项目,你可以在连接检查器中看到它所连接的 outlet。 - Paulw11
显示剩余2条评论
2个回答

7
我在Storyboard中定义视图,然后通过ctrl+拖动将它们添加到我的ViewController类中。这使我能够设置监听器等内容。
控制拖动不仅可以添加监听器,还可以添加输出连接(outlet connections)。在代码中,输出连接看起来像这样:
@IBOutlet var myUIElement: UIXXXX!

您可以使用标识符myUIElement来引用视图。以下是如何添加输出连接的示例:
  • 对视图进行控件拖动,例如UIImageView到视图控制器类中,出现以下内容:

enter image description here

看到那里的“输出”一词了吗?这意味着您正在添加一个输出连接。让我们称之为myImage输出。因此,在代码中,它将如下所示:

@IBOutlet weak var myImage: UIImageView!

现在,您在故事板中拥有对图像视图的引用!就像Java一样,但更短。让我用Java写一下,这样您就能更清楚地了解:

private ImageView myImage;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setLayout(R.layout.someLayout);
    myImage = (ImageView)findViewById(R.id.someId);
}

如果你想获取一个原型表视图单元格,还有另一种方法:

  • In the storyboard, select the cell, and add a reuse identifier to the cell, say my cell.
  • In the table view controller, call this method:

    let cell = tableView.dequeueReusableCellWithIdentifier("my cell")
    
现在您可以获得单元格!

后面的代码还正确吗?现在XCode似乎要求使用tableView.dequeueReusableCell(withIdentifier: "my cell ") - phihag
@phihag 没错。如果我没记错,这个答案是用 Swift 2 写的。 - Sweeper
@Sweeper 我是iOS的新手(更习惯于Android),对此感到非常困惑。这个是否可以不使用拖放机制来完成?如果不能,我想Xcode会在其他地方生成一些代码来将输出链接到特定视图。如果可以,那么链接是如何完成的?如果我在我的storyboard中创建一个具有完全相同属性的第二个视图,那么哪一个会被输出链接? - Chris Neve
@ChrisNeve 这就是 Xcode 的魔力。在编译期间,Storyboard 会被编译成一个 Nib 文件。然后在运行时,当视图控制器被初始化时,它会读取 Nib 文件,并根据文件内容初始化所有的 IBOutlet 属性。 - Sweeper
@Sweeper 好的,所以没有拖放机制是行不通的,对吧? - Chris Neve
@ChrisNeve 好的,故事板文件只是一个XML文件。拖放操作只是在该视图控制器下的<connections>标签下添加一个新的<outlet>标签。因此,从技术上讲,您可以直接编辑故事板文件,但我相信每个人都会选择拖放操作。 - Sweeper

1
如果您查看xib文件的内容,您会发现类似以下的内容
<view contentMode="scaleToFill" id="iN0-l3-epB">

因此,我认为xCode使用生成的标识符将这些视图连接到您的IBOutlets。

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