IBOutlets和IBactions要求! 到底
我试着从Obj-C开始,到今天的Swift,我正在阅读文档。 我试图在Swift中创build一个简单的IBOutlet,它不断给我提供这些错误。
View Controller has no initialiser
需要的init(coder aDecoder:NSCoder){fatalError(“init(coder 🙂 has not been implemented”)}
IBOutletproperty has non-optional type 'UILabel'
并不断popup这个代码:
@IBOutlet var outputLabel : UILabel
但是当我添加一个! 马克,它运行没有像这样的错误
@IBOutlet var outputLabel : UILabel!
同样的事情发生的IBActions …
首先要知道,究竟是什么!
和?
- 使用
?
:如果这个价值在将来可能成为零,那么你为此testing。 - 使用
!
:如果未来真的不应该成为零,但最初应该是零。
@IBOutlet:
当你在Swift中声明一个sockets时,编译器会自动将这个types转换成一个弱隐式解包的可选项,并赋予它一个初始值为nil
值。
实际上,编译器用@IBOutlet weak var name: Type! = nil
replace@IBOutlet var name:
Type @IBOutlet weak var name: Type! = nil
@IBOutlet weak var name: Type! = nil
。
Xcode会改变它,并强制声明@IBOutlet
非选项typesvariables的限制,所以下面两种types的@IBOutlet
的声明是有效的,直到date。
@IBOutlet var outputLabel : UILabel! @IBOutlet var priceLabel : UILabel?
但是,如果您控制在testing版4中拖放标签的出口,则会发生以下情况:
@IBOutlet var priceLabel : UILabel! = nil
那是对的。 在Swift中,Xtypes的variables不能为零,这意味着它必须被初始化。 这意味着您必须初始化init
方法或内联初始化。
一般来说,视图控制器将声明可选types的variables – 例如,
@IBOutlet var outputLabel : UILabel!
这意味着你不需要初始化outputLabel
,默认情况下,它的值是nil
。 这是IBOutlet
variables的一般模式,因为variables是在init
方法之外设置的。
如果你没有使你的variables可选,你必须初始化它。 如果你不初始化内联,你必须提供一个init
方法 – 因此你得到的错误。
接口生成器数据在视图控制器启动后加载,所以初始化后出口不能有值。 使用隐式解包的可选属性(在这种情况下为sockets),您承诺在启动对象后属性可能为零,但稍后(在加载笔尖或故事板之后)会分配它们的值。
由于Stack允许Q和A风格的问题,我也会把它放在简单的话中。 只要把!
在和网点的人。 非常感谢你的帮助。
错误
'required' initialized 'init(coder:)' must be provided by subclass of 'UIViewController'
我添加时突然开始
var start : NSDate
到以前工作的UIViewController的子类,否则全部在IB中完成。 改成
var start : NSDate?
固定。 这是一个令人惊讶的错误(编码器?),对于一个简单的编辑人来说,启动一个应用程序可能会遇到很长时间才会遇到编码器或创build他们自己的init方法,这可能有助于明确表明初始化需求不局限于IBOutlets。 上面的答案描述了根本原因。
当视图或视图控制器从界面构build器文件初始化时,它们的插口不能连接。 他们只会在初始化后连接,所以他们需要是可选的。 当初始化后调用类中的任何其他代码时,这些sockets保证连接。 这就是为什么IBOutlets总是被声明为隐含的解包选项。
- 将标签链接到IBOutlet会提供NSUnknownKeyException
- 致命错误:在Swift中展开可选值时意外发现了零
- UIStoryboard容器将IBOutlet附加到父ViewController
- 自定义InfoWindow标记谷歌地图SDK,Swift 2.0
- IBOutlets应该是Ivars还是属性?
- awakeFromNib,网点和故事板:是文件错误?
- 无法将连接器从IBOutlet链接到View Controller
- 在instantiateViewControllerWithIdentifier之后的IBOutlet nil
- IBOutlet在两个故事板上的两个viewController …是可能的