2014-09-28 11 views
24

Bu kodun here ve here çalıştığı bildirildi, ancak çalışmayı göze alamıyorum.'gerekli' başlatıcı 'init (kodlayıcı :)' 'UITableViewCell' 'alt sınıfı tarafından sağlanmış olmalıdır

IBOutlets, hikaye panosundaki nesnelerine bağlanır. Bu prototypeCell ismini kullanarak dequeueReusableCellWithIdentifier ile kullanabilir ve özel sınıf özniteliği commentCell olarak ayarlanmıştır.

İlk Hatası (I çözebilir ki, ancak bağlantıların ne yukarıda beni yanlış bir şey yapıyorum düşündürüyor gerekli Haklı mıyım.?):

Overriding method with selector 'initWithStyle:reuseIdentifier:' has incompatible type '(UITableViewCellStyle, String) -> commentCell' 

İkinci Hatası (ilginç hatası):

'required' initializer 'init(coder:)' must be provided by subclass of 'UITableViewCell'` 

Hücre Sınıfı kodu:

class commentCell: UITableViewCell { 
    @IBOutlet weak var authorLabel: UILabel! 
    @IBOutlet weak var commentLabel: UITextView! 

    init(style: UITableViewCellStyle, reuseIdentifier: String) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
    } 
} 

Başlatma kodu:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    println(comments[indexPath.row]) 

    var cell = self.tableView.dequeueReusableCellWithIdentifier("prototypeCell") as commentCell 

    cell.commentLabel.text = comments[indexPath.row]["comment"] as NSString 
    cell.authorLabel.text = comments[indexPath.row]["fromid"] as NSString 
    return cell 
} 

cevap

40

ilk başlatıcı için doğru imza şudur: ? ile gösterildiği gibi reuseIdentifier, bir Optional olan

init(style style: UITableViewCellStyle, reuseIdentifier reuseIdentifier: String?) 

olduğuna dikkat edin.

Sınıfın belirlenmiş başlatıcılarını geçersiz kılarsanız, belirtilen diğer başlatıcıları devralmazsınız. Ancak UIView, init(coder:) başlatıcısını gerektiren NSCoding protokolünü kullanır. Yani sende bu uygulamalıdır:

init(coder decoder: NSCoder) { 
    super.init(coder: decoder) 
} 

Ancak, gerçekte süper çağırmadan hariç başlatıcısı biriyle bir şey yapıyor, o yüzden ettiğinizi başlatıcı ya uygulamak gerek yok! Belirlenen başlatıcıları geçersiz kılmazsanız, tüm süper sınıfınızın belirlenmiş başlatıcılarını devralırsınız.

Bu yüzden benim tavsiyem, init(style:reuseIdentifier:) başlatıcısını tamamen kaldırmanızın gerekmediği sürece tamamen kaldırmanızdır.

Ve bunun için bazı başlatma eklemeyi planlıyorsanız, film şeridindeki bu prototip hücreler tavsiye edilebilir olan init(style:reuseIdentifier:) tarafından başlatılmadı. Onlar init(coder:) tarafından başlatıldı.

+2

Herhangi bir tahmin? – User

+0

O halde neden init (kodlayıcı) yönteminde authorLabel için varsayılan bir metin kurarsınız? Bunu yapmak çalışırsanız, ben ("önemli bir hatayla: İsteğe Bağlı değerini unwrapping ederken beklenmedik nil bulundu") istisna olsun. Bu süper tarafından başlatılması için gitmiyor ve henüz storyboard alınan değil, sanırım. Peki, nerede ve nasıl yapmalıyım? – Maiaux

+0

Şimdi anlıyorum. AwakeFromNib içinde yapılmalıdır. Eğer belirlenmiş bir başlatıcı geçersiz kılmaz – Maiaux

3

Prototip hücreyle storyboard kullanıyorsanız neden özel UITableViewCell sınıfına ihtiyacınız olduğuna emin değilsiniz. Etiketlerinizi ve metin görüntülemelerinizi hücreye bırakıp onlarla çalışabilirsiniz.

sen anladım sonra xib gelen çalışıyorsanız, ancak yalnızca gerekir: cellForRowAtIndexPath İlişkin

override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.registerNib(UINib(nibName: "commentCell", bundle: nil), 
      forCellReuseIdentifier: "reuseIdentifier") 
    } 

:

class commentCell: UITableViewCell { 
    @IBOutlet weak var authorLabel: UILabel! 
    @IBOutlet weak var commentLabel: UITextView! 

} 

Sonra ile TableView sınıfında xib kuracağını fonksiyonu, sözdizimi artık biraz modifiye:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { 

var cell = self.tableView.dequeueReusableCellWithIdentifier("prototypeCell") as commentCell 



     return cell 
    } 

onlara içerik yayınlamak istiyorsanız Github, değişiklik yapmaya yardımcı olabiliriz. Daha fazla kod görmeden spesifik olmak zor. `Var hücre = commentCell` olarak self.tableView.dequeueReusableCellWithIdentifier ("prototypeCell") LLBD bir hata verir neden

+0

'Bağlantı "commentLabel" onun destination.' olarak bir prototip nesnesi olamaz, işte bu yüzden – User

İlgili konular