围绕iOS中的对象我的想法

时间:2017-01-21 21:38:25

标签: ios swift uiview

我无法理解对象的概念。从我所读过的内容来看,他们是一个班级的实例。学习迅速时,他们很容易理解。只需创建一个类并创建一个实例,然后就可以修改它的属性并调用它的方法:

class ExampleClass {
    let ExampleProperty = "rabbit"
}

let exampleInstance = ExampleClass()

但是我不知道在使用iOS时这是如何转换的,因为我还没有看到任何明确创建的对象:

var example = Wss()

所以我的问题是:

  1. 是按钮,标签和滑块对象吗?
  2. - 如果是,那么"代码"在他们后面?为什么按钮,标签等在通过插座和操作连接到View Controller之前显示?是否有隐藏" var thisButton = ThisViewController()"嵌入到每个滑块和按钮中?

    1. 如果我的假设是错误的,有人可以向我解释对象是如何工作的吗?

4 个答案:

答案 0 :(得分:1)

  

"是否有隐藏" var thisButton = ThisViewController()"嵌入到每个滑块和按钮中?"

不,这正是界面构建者擅长的地方。许多Xcode的现代Interface Builder都来自NeXTSTEP。当您拖出像NSButton这样的新UI组件并将其放在故事板上时,Xcode会为您实例化NSButton类的新对象。保存文件时,Xcode 将故事板的所有对象序列化.nib文件中。在它被发明的时候,由于Objective C的活力,它完全是革命性的。它使GUI编程变得更加简单和动态。故事板中的每个对象都知道它的类。例如,当您实例化新的NSButton时,您可以打开检查器并亲眼看看它的类是NSButton。向应用程序添加自定义视图时,它们会以相同的方式跟踪其类。每当加载nib文件时,这些视图都会从其类中实例化。您可能已经注意到,您永远不会覆盖视图的初始化程序。相反,您可以覆盖awakeFromNib之类的方法。这是因为从第一次实例化对象开始,到现在为你做了大量的幕后工作。在此期间,IBOutlets和IBActions将为您服务。

竞争对手试图制作类似的界面构建应用程序,但他们最终还是在幕后进行代码生成。在这些系统中,当您保存接口文件时,程序将生成一个源文件,该文件包含指示在加载接口时如何重新实例化这些对象的代码。然而,事实证明,只是序列化对象的任务要复杂得多,因此这些系统容易出错,而且调试起来要困难得多(因为您试图调试机器生成的源文件)。

答案 1 :(得分:0)

回答你的问题:

  1. 是。您的对象只是从NIB或Storyboard创建的。因此,NIB或Storyboard将为您创建这些可视(UI)元素,然后您可以通过IBOutlets
  2. 访问这些元素。
  3. 您的假设并非完全错误,实际上有些东西会为您分配这些对象。 NIB或Storyboard只描述了创建这些对象的方法。还有一些其他的定制,如框架,颜色等。
  4. 有关如何找到这种情况的更多信息here

答案 2 :(得分:0)

以亚历山大的答案为基础:

UIView对象有一个方法init(frame:),可以让你用指定的框架创建一个新的UIView对象。

其他UIView子类可能具有接受其他参数的init方法。

UIView对象还支持一个知道如何从存储数据流创建对象的init方法init(coder:)。这被称为"反序列化"该对象,或将其从字节流转换回运行对象。

在Interface Builder中的Storyboard或XIB文件中构建对象时,系统会将对象序列化为字节流并将其保存到Storyboard / XIB中。

然后,当您调用storyboard scene / XIB时,系统将读取数据流并使用它来重新创建(反序列化)storyboard / XIB中描述的对象。

效果与编写一堆创建和配置所有视图的代码基本相同,但不是编写所有代码,而是可以在Interface Builder中构建界面,这样更快更容易创建,并且比一堆自定义代码更快,更容易更新和维护。

答案 3 :(得分:0)

  

但我没有看到使用iOS时的翻译方式,因为我还没有看到任何明确创建的对象

iOS中的对象与您理解的对象之间没有区别。对象是类的实例。您需要了解的是,您自己的代码不是唯一可以创建对象的地方,您自己的代码通常会与代码外部创建的对象进行交互。这是一个简单的例子:

let defaults = NSUserDefaults.standardUserDefaults()

此处defaults获取对系统提供的用户默认对象的引用。您永远不需要自己实例化NSUserDefaults

  

buttons,标签和滑块对象吗?

是的,这些分别是UIButtonUILabelUISlider的实例。

  

如果是这样,他们背后的“代码”在哪里?

它在UIKit framework。您无法查看这些类的源代码,但您仍然可以通过将框架链接到您的应用程序来使用它们。

  

为什么按钮,标签等在通过插座和操作连接到View Controller之前显示?

你在这里谈论故事板。在Xcode的storyboard编辑器中设置视图时,存储在storyboard文件中的数据基本上是包含序列化对象的archive。从故事板实例化视图控制器时,故事板中的对象将从该数据重新创建,然后连接到视图控制器的出口。您可以通过实例化一个新的视图控制器来自己启动此过程:

let storyboard = UIStoryboard(name: "MyStoryboard", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "MyViewController")

您通常不需要这样做,因为故事板中的segue提供了场景之间的转换,包括创建作为给定segue目标的视图控制器。