我遇到了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)
}
}
答案 0 :(得分:247)
您必须使用隐式展开的选项,以便Swift可以在初始化阶段处理循环依赖(在这种情况下,UI组件的父< - >子)。
@IBOutlet var imgBook: UIImageView!
@IBOutlet var titleBook: UILabel!
@IBOutlet var pageBook: UILabel!
阅读此doc,他们很好地解释了这一点。
答案 1 :(得分:90)
快速修复 - 确保所有在创建时未初始化的变量(例如var num : Int?
vs var num = 5
)都有?
或!
。
长答案(推荐) - 按照mprivat的建议阅读doc ...
答案 2 :(得分:32)
这是来自Apple doc
在创建该类或结构的实例时,类和结构必须将其所有存储属性设置为适当的初始值。存储的属性不能保留在不确定的状态。
您收到错误消息 Class" HomeCell"没有初始值设定项,因为您的变量处于不确定状态。您可以创建初始化程序,也可以使用它们创建可选类型!还是?
答案 3 :(得分:25)
我的回答一般是解决错误,而不是OP的确切代码。没有回答提到这个说明所以我只是想添加它。
以下代码也会生成相同错误:
class Actor {
let agent : String?
}
其他人提到您可以创建初始值设定项,也可以使用它们创建可选类型!或?这是正确的。但是,如果您有可选的成员/属性,则该可选项应该是可变的,即 var
。如果您创建let
,则永远不会能够退出nil
状态。那太糟糕了!
所以正确的写作方式是:
class Actor {
var agent : String? // it has a chance so its value can be set!
}
或者你可以把它写成:
class Actor {
let agent : String?
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"
}
我的回答一般是解决错误,而不是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"
}
答案 4 :(得分:8)
在我的情况下,我已声明Bool
这样:
var isActivityOpen: Bool
即。我声明它没有展开,所以,这就是我解决( no initializer )错误的方法:
var isActivityOpen: Bool!
答案 5 :(得分:1)
不是您问题的具体答案,但是在我将枚举的初始值设置为属性时,我没有设置此错误。我为枚举分配了一个初始值来解决此错误。 在这里发布,因为它可能有助于某人。
答案 6 :(得分:0)
只需为 HomeCell 类
提供init块它在我的案例中工作