En 我们上一篇文章 我们在应用程序的界面中包含了一个 Label、一个 TextField 和一个 Button。 我们希望在单击 Button 时使用在 TextField 中输入的内容更新 Label 的内容。 我们已经(步骤 1)创建了项目,并且(步骤 2)使用 InterfaceBuilder 来定义屏幕。 现在我们将继续执行其余步骤以使应用程序正常工作。
步骤 3. 在 ViewController 中创建变量。
我们的界面正确。 事实上,如果我们进行 Build & Go,我们可以看到我们是如何做的:
但显然按下按钮时没有任何反应,因为我们还没有进行最低限度的基本开发。 在这第 3 步中,我们将在接口(.h 文件)和实现(.m 文件)中引入 HelloWorldViewController 中的变量和方法。 为此,正如我们在上一篇文章末尾指出的,我们必须知道 TextField 对应于 UITextField 类,而 Label 对应于 UILabel 类。 这两个类在 UIKit 框架内。
如果我们还没有关闭并保存 Interface Builder,我们会这样做,并在 XCode 中打开文件 HelloWorldViewController.h。 现在的代码将是这样的:
我们已经在研究一些 Objective-C。 在这段代码中,我们看到了 UIKit 库的导入声明,其中 UILabel 和 UITextField 类位于其中。 我们看到了接口是如何声明的,它是从 UIKit 的通用 UIViewController 扩展而来的。
在接口代码中,我们包含以下代码:
我们现在可以解释我们所做的:
- 我们在@interface 块中声明了 UILabel 和 UITextField 类型的 2 个属性,分别具有 2 个变量名称 * label 和 * textField。 前方出现IBOutlet。 这是什么? 我们自己解释。 IBOutlet 不是一种变量; 是一个指令,帮助 Interface Builder 知道这些 UILabel 和 UITextField 类型的变量的存在。 顺便说一下,请记住,在上一篇文章中,我们已经给了您一个技巧来了解 Interface Builder 中控件对象(按钮、标签、文本字段等)的变量类型。 另一方面,变量名前面的 * 问题可能会让 Java 程序员感到惊讶,而不是 C 的程序员......但要了解这就是在 Objective-C 中编写实例变量的方式。
- 声明了 UILabel 和 UITextField 属性。 nonatomic 和 retain 我们暂时不会看到,它与内存管理有关。
- 我们看到我们声明了一个方法,updateText。 它前面有一个-号,表示它是一个实例方法,而不是一个类方法(+号为他们解释)。 我们无法解释这一点,因为这是基本的面向对象编程……该方法不返回任何内容(即 void)并接收类型为 id 的参数。 基本上它指的是将导致调用我们的 updateTexto 方法的对象的标识符,该方法将更新标签的值。 我们可以猜测,因为该控件将是按钮本身......
一旦完成,我们就完成了第 3 步。
步骤 4. 将视图控件绑定到控制器变量。
如果我们回顾一下,一方面我们已经开发了与 Interface Builder 的接口,另一方面我们在 HelloWorldViewController.h(HelloWorldViewController.m 控制器类的接口)中有与这些控件相关的变量。 但是,视图和控制器之间仍然没有任何关系,即我们没有给出任何相关的指令,例如我们在Interface Builder中设计的文本字段与我们放入的UITextField类型的变量类。 现在我们要做这个任务。 我们通过单击 HelloWorldViewController.xib 再次打开 Interface Builder,单击文本框,然后在 Inspector 面板中我们转到第二个选项卡(Text Field Connections)。 我们看到有一个叫做引用插座的部分,没有任何标记。 这意味着目前 Interface Builder 不知道此文本字段与类的 IBOutlet(Interface Builder Outlet)之间的任何关系……但是我们的 HelloWorldViewController 中有一个 UITextField IBOutlet,因此我们将链接它。
为此,如图中所示,通过单击“New Referencing Outlet”旁边的小圆圈,我们将其拖到名为 HelloWorldViewController.xib 的窗口的 File's Owner。 它将让我们选择 2 个选项,view(完整视图)和 textField(我们的变量)。 显然我们选择了 textField,因此我们将我们的文本框与其类型为 UITextField 的变量相关联。 顺便说一句,File'sOwner 或文件的所有者既不大于也不小于我们的控制器类......
我们使用标签重复操作,将其与我们的控制器变量标签相关联。 而使用按钮,则有所不同。 在这种情况下,我们将把它与我们的 updateTexto 操作相关联,但针对特定事件。 使用“Touch Up Inside”事件执行此操作,然后选择我们的 updateTexto 方法:
通过这种方式,我们已经将我们在 Interface Builder 中定义的控件和我们放入控制器中的变量相关联。 我们关闭 Interface Builder 保存所有内容,然后转到返回 XCode 的最后一步。
步骤 5. 最新进展。
在 XCode 中,我们打开 HelloWorldViewController.my 并放入以下代码,使我们的类看起来像这样:
如果我们仔细观察,我们只是简单地放置了块@synthesize,以及在接口 .h 中声明的方法的实现,updateTexto。 在该代码下方,您将有很多带注释的代码。
@synthesize 行的作用类似于生成 OO 语言(封装)中典型的典型 getter / setter (访问器 / mutator)。 我们需要它们以便控制器到达内容,例如,文本框的内容。
如您所见,updateTexto 方法只是用文本字段的内容更新我们标签的文本。 我们完了。
现在,我们只需执行 Build & Go,您将看到当您输入文本字符串并单击按钮时,标签的内容已更新。 在下一篇文章中,我们将介绍对我们的应用程序的改进。
非常好的教程,非常清晰和简单。
好吧,我一定很甜🙁因为它对我不起作用。 我已经捕获了一个字符串中的值,它需要文本,但它没有将它分配给标签,至少它没有绘制它,因为我尝试查看 label.text 并且它告诉我超出范围......
你的教程很棒,它真的很好地解释了iphone的这个开发,我希望你继续发布更多的教程。
问候
嗨,一切都很好,但它不起作用。 为了使它工作,我必须将界面构建器的视图与多维数据集中的视图链接起来,就像你教的文本字段和标签一样。 其余的,非常感谢。