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 、彼らはそれをすべてうまく説明しています。
クイックフィックス - 作成時に初期化されないすべての変数(例えばvar num : Int?
vs var num = 5
)が?
か!
のどちらかであることを確認してください。
長い回答(推奨) - mprivatが示唆しているように ドキュメント を読む...
これはアップルからです doc
クラスと構造体は、そのクラスまたは構造体のインスタンスが作成されるまでに、格納されているすべてのプロパティを適切な初期値に設定する必要があります。保存されたプロパティは不確定な状態のままにすることはできません。
エラーメッセージが表示されます。クラス "HomeCell"には初期化子がありません。変数が未確定状態にあるためです。初期化子を作成するか、あるいはそれらをオプション型にするかのどちらかを使用します。それとも?
私の答えは、一般的なエラーであり、OPの正確なコードではありません。このノートには答えがありませんでしたので、追加したと思いました。
以下のコードでも同じエラーが発生します。
class Actor {
let agent : String?
}
他の人たちはと言っていますあなたが初期化子を作成するか、あなたはそれらをオプションの型にします。または?が正しいです。ただし、オプションのメンバ/プロパティがある場合は、そのオプションは可変にする必要があります。つまり、var
です。 let
を作ると、neverは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
を作ると、neverは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"
}
私の場合、私はこのようにBool
を宣言しました:
var isActivityOpen: Bool
つまり、アンラップせずに宣言しました。これで、(noイニシャライザ)エラーが解決されました。
var isActivityOpen: Bool!
あなたの質問に対する具体的な答えではありませんが、プロパティとして宣言しているときにenumの初期値を設定していなかったときにこのエラーが発生しました。このエラーを解決するためにenumに初期値を割り当てました。それが誰かに役立つかもしれないのでここに投稿してください。
HomeCellクラスのinitブロックを提供するだけです。
私の場合はうまくいきました