2014-06-28 13 views
20

BenSwift'de dequeueReusableCellWithIdentifier nasıl kullanılır?

tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) 

ben tableview sonra hata ortadan kalkar paketini ise UITableView? does not have a member named 'dequeueReusableCellWithIdentifier'

diyor hattı

let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) 

bir hata alır, ancak Objective-C biz de yorumsuz normal olarak hücrenin var olup olmadığını kontrol eder ve eğer yeni bir tane yaratmazsak. Swift'de, sağlanan taban plakası let anahtar sözcüğünü kullanıyor ve isteğe bağlı bir istekte bulunmadığından, sıfır ise yeniden atayamayız.

Swift'de dequeueReusableCellWithIdentifier öğesini kullanmanın uygun yolu nedir?

+0

kullanın. Bu yöntemle hayır. docs: "UITableViewCell nesnesi, ilgili yeniden kullanım tanımlayıcısı ile birlikte. Bu yöntem her zaman geçerli bir hücre döndürür" –

+0

Ayrıca şaşkın ben de ObjC günlerini hatırlıyorum çünkü nil için yeniden kullanmanız gereken bir hücre olmadıysa ve yeni bir nil oluşturduysa "reuseIdentifier" ile hücre. Mevcut Apple belgesini tekrar okudum ve "Bu yöntem mevcut bir hücreyi yok ederse veya daha önce kaydettiğiniz sınıfı veya nib dosyasını kullanarak yeni bir tane oluşturuyorsa" diyor. Yani, işlev hem bizim için hem de, güzel olanı yapar. Ancak bu tartışmaya bakın, 2 dequeue çağrısı vardır - biri isteğe bağlı, diğeri değil: [link] (https://www.natashatherobot.com/ios-using-the-wrong-dequeuereusablecellwithidentifier/) –

cevap

32

Sen örtük yönteme parametreleri paketini ve ayrıca aşağıdaki özlü kodu vermek üzere dequeueReusableCellWithIdentifier sonucunu yayınlayabileceğim: Hücre tipi tablosundaki önce tablo görünümünde kayıtlı değilse

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("CellIdentifier", forIndexPath: indexPath) as UITableViewCell 

    //configure your cell 

    return cell 
} 
+3

Bu benim de yapabileceğim cevap - fonksiyon tanımında '' 'yerine' '' (örtülü olarak isteğe bağlı olarak isteğe bağlı) kullanılması büyük bir farktır (sadece hemen fark etmeyenler için işaret etmek) fark). Ayrıca XCode 6'da Apple tarafından sağlanan kazan plakasının da bununla birlikte tanımlarının yerini alacağını düşünüyorum. – JuJoDi

5

Bunu isteğe bağlı

if let realTableView = tableView { 
    let cell = realTableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) 
    // etc 
} else { 
    // tableView was nil 
} 

olduğu gibi tableView değişkeni paketini gerekiyor yoksa Objective-C gidecektik' ilişkin sorunuza cevap olarak

tableView?.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) 

bunu kısaltabilir normal olarak hücrenin var olup olmadığını kontrol edin ve eğer yeni bir tane yaratmazsak, 'dequeueReusableCellWithIdentifier her zaman bir hücre döndürür (bu tanımlayıcı için bir sınıf veya bir uç kaydetmiş olmanız koşuluyla). yeni bir tane oluşturmak.

+0

dequeueReusableCellWithIdentifier her zaman bir hücre döndürün, cf belgeleri – greg3z

+0

Maalesef, doğru şekilde ayarladıysanız her zaman bir hücre döndürdüm.Daha net olması için düzenledim – iain

+0

Eğer bu yaklaşımı cellForAtIndexPath içinde kullanırsanız, hücreyi nasıl iade edersiniz? – senty

24

private let cellReuseIdentifier: String = "yourCellReuseIdentifier" 

// MARK: UITableViewDataSource 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier) 
    if (cell == nil) { 
    cell = UITableViewCell(style:UITableViewCellStyle.Subtitle, reuseIdentifier:cellReuseIdentifier) 
    } 
    cell!.textLabel!.text = "Hello World" 
    return cell! 
} 
+0

Hızlı 2.0'da uyarı verir: 'UITableViewCell'den 'UITableViewCell'e koşullu yayın her zaman başarılı olur' –

+0

Sadece '?? – Zorayr

+0

Evet' i kaldırmalıyım ve sanırım if ifadesi' if (hücre == nil) {' ... ayrıca kaldırılmalı. Hücre isteğe bağlı türde olmadığından bir hata verir. –

2

hızlı 3 versiyon:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath!) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier:"CellIdentifier", for: indexPath) as UITableViewCell 
     return cell 
    } 
yükler, bir cep örneğini almak için aşağıdakileri kullanabilirsiniz 0
1

Swift 3 ve Swift ise 4 Versiyon sadece sıfır olabilir hücreyi ilişkin bu

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath as IndexPath) as UITableViewCell 
     cell.textLabel?.text = "cell number \(indexPath.row)." 

     //cell code here 

     return cell 
    } 

Swift 2'de Sürüm

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("CellIdentifier", forIndexPath: indexPath) as UITableViewCell 

cell.textLabel?.text = "cell number \(indexPath.row)." 

     //cell code here 

     return cell 
    } 
İlgili konular