Sınıfta herhangi bir başlatıcı yok Swift


181

Swift sınıfıyla ilgili bir sorunum var. UITableViewController sınıfı ve UITableViewCell sınıfı için hızlı bir dosya var. Benim sorunum UITableViewCell sınıfı ve çıkışları. Bu sınıfta bir hata var Sınıf "HomeCell" hiçbir başlatıcıları vardır ve bu sorunu anlamıyorum.

Yanıtlarınız için teşekkürler.

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)
    }

}

İsteğe bağlı UINib olarak nib değişkeninin türünü açıkça belirtmeniz mi gerekiyor?
Cocoadelica

Yanıtlar:


257

Başlatma aşaması sırasında Swift'in dairesel bağımlılıklar (bu durumda UI bileşenlerinin üst <-> alt öğesi) ile baş edebilmesi için örtük olarak kaydırılmamış seçenekler kullanmanız gerekir.

@IBOutlet var imgBook: UIImageView!
@IBOutlet var titleBook: UILabel!
@IBOutlet var pageBook: UILabel!

Bu dokümanı okuyun , her şeyi güzelce açıklıyorlar.


21
Açıklamanız ve o dokümanın hepsi bana mantıklı geliyor, ama hata mesajı değil!
Coco

4
Muhtemelen Apple için bir soru
mprivat

Ayrıca @IBOutlets, döngüden kaçınmak için zayıf olarak işaretlenmelidir.
Dennis Pashkov

@Dennis Pashkov Bildiğim kadarıyla, yalnızca viewController'ın görünüm hiyerarşisinde olan IBOutlets içindir. Aksi takdirde kimse serbest bırakılacağı için derhal serbest bırakılır.
Alston

3
Ben kullanarak bir Bool tanımladığım bu sorun vardı var myBool: Bool.
jungledev

96

Hızlı düzeltme - oluşturulduklarında başlatılmayan tüm değişkenlerin (örn. var num : Int?Vs var num = 5) a ?veya olduğundan emin olun !.

Uzun cevap (tavsiye edilen) - mprivat'ın önerdiği gibi dokümanı okuyun ...


Bu hatayı gidermek için? İçin varsayılan değer ayarlamanız gerekir. değişkenler, örneğin: showUserPointViewDelegate: ShowUserPointsViewControllerControl? = Nil
Vladimir Vodolazkiy

+1 ?, sıfır olabileceği anlamına gelir, ancak öyleyse, ilerlemek ve hiçbir şey yapmamakla ilgili bir sorun yoktur. !Eğer paket açmadan sonra nil, yani her ikisi de başlatma gereksinimini karşılar - derleyiciyi bilgilendirirseniz: nil'den başlayacağını biliyorum / istiyorum.
Tatlım

Ara varve letsen denetleyicisi görünümünde ve kayıp göz !ler ve ?s
Wiingaard

33

Bu Apple doc'den

Sınıflar ve yapılar, bu sınıfın veya yapının bir örneği oluşturulduğunda depolanan tüm özelliklerini uygun bir başlangıç ​​değerine ayarlamalıdır. Saklanan özellikler belirsiz bir durumda bırakılamaz.

Değişkenleriniz belirsiz bir durumda olduğu için "HomeCell" Sınıfının başlatıcısı hata mesajını alıyorsunuz . Ya başlatıcılar oluşturursunuz ya da bunları kullanarak isteğe bağlı türler oluşturursunuz! veya?


32

Cevabım OP'nin tam kodunu değil genel olarak hatayı ele alıyor. Bu nottan hiç cevap gelmedi, bu yüzden eklediğimi düşündüm.

Aşağıdaki kod da aynı hatayı oluşturur :

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
}

Diğerleri, ya başlatıcılar oluşturduğunuzu ya da bunları isteğe bağlı türler yaptığınızı belirtmişlerdir! veya? hangisi doğru. Ancak, isteğe bağlı bir üyeniz / mülkünüz varsa, bu isteğe bağlı değişebilir olmalıdır var. Eğer bir yaparsanız, leto zaman asla durumundan çıkamazdı nil. Bu kötü!

Yani yazmanın doğru yolu:

Seçenek 1

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!
}

Veya şu şekilde yazabilirsiniz:

Seçenek 2

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!
    }
}

veya herhangi bir değere varsayılan olarak ( nilki bu biraz aptalca dahil )

3. seçenek

class Actor {
let agent : String? = nil // very useless, but doable.
let company: String? = "Universal" 
}

Neden let(aksine var) başlatılmadığını merak ediyorsanız , burada ve buradanil okuyun


2
Resmi eklediğiniz için teşekkür ederiz.
Jim

İyi açıkladı !!
Mahendra

1
Nil'e ayarlamak aptalca değil, kaç modelin çalıştığının doğasında var.
çekti ..

@ çekti .. değişmez bir şey ayarlamak nilçok yanlış. Bir ' vari ayarlamak nilfarklı bir şeydir.
Bal

hey tatlım, değişmez nesnelere kim konuşuyordu?
çekti ..

10

Benim durumumda böyle bir ilan ettim Bool:

var isActivityOpen: Bool 

yani ben paketini açmadan ilan, Bu nasıl ( başlatıcı ) hata çözüldü :

var isActivityOpen: Bool!

1

Sorunuza özel bir cevap değil, ancak bir özellik olarak bildirirken bir numaralandırma için bir başlangıç ​​değeri ayarlamadığımda bu hatayı aldım. Bu hatayı gidermek için numaralandırmaya bir başlangıç ​​değeri atadım. Birine yardımcı olabileceği için buraya gönderiyorum.


0

HomeCell sınıfı için init bloğunu sağlamanız yeterlidir

benim durumumda iş

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.