我对 Swift 类有疑问。我有一个 UITableViewController 类和 UITableViewCell 类的 swift 文件。我的问题是 UITableViewCell 类和插座。这个类有一个错误类“HomeCell”没有初始化器,我不明白这个问题。
感谢您的回复。
import Foundation
import UIKit
class HomeTable: UITableViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet var tableViex: UITableView!
var items: [(String, String, String)] = [
("Test", "123", "1.jpeg"),
("Test2", "236", "2.jpeg"),
("Test3", "678", "3.jpeg")
]
override func viewDidLoad() {
super.viewDidLoad()
var nib = UINib(nibName: "HomeCell", bundle: nil)
tableView.registerNib(nib, forCellReuseIdentifier: "bookCell")
}
// Number row
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.items.count
}
// Style Cell
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("bookCell") as UITableViewCell
// Style here
return cell
}
// Select row
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// Select
}
}
// PROBLEM HERE
class HomeCell : UITableViewCell {
@IBOutlet var imgBook: UIImageView
@IBOutlet var titleBook: UILabel
@IBOutlet var pageBook: UILabel
func loadItem(#title: String, page: String, image:String) {
titleBook.text = title
pageBook.text = page
imgBook.image = UIImage(named: image)
}
}
您必须使用隐式展开的选项,以便 Swift 可以在初始化阶段处理循环依赖关系(在本例中为 UI 组件的父<->子级)。
@IBOutlet var imgBook: UIImageView!
@IBOutlet var titleBook: UILabel!
@IBOutlet var pageBook: UILabel!
阅读这个doc,他们解释得很好。
我的回答解决了一般错误,而不是OP的确切代码。没有答案提到此注释,所以我只是想添加它。
下面的代码也会生成相同错误:
class Actor {
let agent : String? // BAD! // Its value is set to nil, and will always be nil and that's stupid so Xcode is saying not-accepted.
// Technically speaking you have a way around it🤓, you can help the compiler and enforce your value as a constant. See Option3
}
其他人提到您可以创建初始值设定项,或者使用 ! 将它们设为可选类型。或 ? 这是正确的。但是,如果您有可选成员/属性,则该可选成员/属性应该是可变的,即
var
。如果你做了一个 let
那么它就永远 无法摆脱它的 nil
状态。那就不好了!
所以正确的写法是:
class Actor {
var agent : String? // It's defaulted to `nil`, but also has a chance so it later can be set to something different || GOOD!
}
或者你可以写成:
class Actor {
let agent : String? // It's value isn't set to nil, but has an initializer || GOOD!
init (agent: String?){
self.agent = agent // it has a chance so its value can be set!
}
}
或将其默认为任何值(包括
nil
,这有点愚蠢)
class Actor {
let agent : String? = nil // very useless, but doable.
let company: String? = "Universal"
}
如果您好奇为什么
let
(与var
相反)没有初始化为nil
,请阅读这里和这里
这是来自 Apple doc
类和结构必须在创建该类或结构的实例时将其所有存储的属性设置为适当的初始值。存储的属性不能处于不确定状态。
您收到错误消息类“HomeCell”没有初始值设定项,因为您的变量处于不确定状态。您可以创建初始值设定项,也可以使用 ! 将它们设置为可选类型。或?
就我而言,我已经声明了这样的
Bool
:
var isActivityOpen: Bool
即我在没有解开包装的情况下声明了它,这就是我解决(没有初始化器)错误的方法:
var isActivityOpen: Bool!
不是您问题的具体答案,但当我在将枚举声明为属性时没有为枚举设置初始值时,我遇到了此错误。我为枚举分配了一个初始值来解决此错误。 在这里发帖,因为它可能会对某人有所帮助。
只需为 HomeCell 类提供 init 块
这对我来说很有效
就我而言,我在类中声明了一个变量年龄,如下所示:
ViewController 类:UIViewController {
变量年龄:Int
}
即后来,我了解到该类没有初始值设定项,并且我进行了更改以给age 变量赋值。我们有两个选择:
我们必须给变量赋值:
var 年龄:Int = 0
“或者,我们可以解开变量:”
var 年龄:Int!