我无法理解对象的概念。从我所读过的内容来看,他们是一个班级的实例。学习迅速时,他们很容易理解。只需创建一个类并创建一个实例,然后就可以修改它的属性并调用它的方法:
class ExampleClass {
let ExampleProperty = "rabbit"
}
let exampleInstance = ExampleClass()
但是我不知道在使用iOS时这是如何转换的,因为我还没有看到任何明确创建的对象:
var example = Wss()
所以我的问题是:
- 如果是,那么"代码"在他们后面?为什么按钮,标签等在通过插座和操作连接到View Controller之前显示?是否有隐藏" var thisButton = ThisViewController()"嵌入到每个滑块和按钮中?
答案 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)
回答你的问题:
IBOutlets
有关如何找到这种情况的更多信息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,标签和滑块对象吗?
是的,这些分别是UIButton
,UILabel
和UISlider
的实例。
如果是这样,他们背后的“代码”在哪里?
它在UIKit framework。您无法查看这些类的源代码,但您仍然可以通过将框架链接到您的应用程序来使用它们。
为什么按钮,标签等在通过插座和操作连接到View Controller之前显示?
你在这里谈论故事板。在Xcode的storyboard编辑器中设置视图时,存储在storyboard文件中的数据基本上是包含序列化对象的archive。从故事板实例化视图控制器时,故事板中的对象将从该数据重新创建,然后连接到视图控制器的出口。您可以通过实例化一个新的视图控制器来自己启动此过程:
let storyboard = UIStoryboard(name: "MyStoryboard", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "MyViewController")
您通常不需要这样做,因为故事板中的segue提供了场景之间的转换,包括创建作为给定segue目标的视图控制器。