2014-06-05 52 views
35

我想要一個UITableViewsubtitle樣式單元格使用dequeueReusableCellWithIdentifier如何在Swift中設置UITableViewCellStyleSubtitle和dequeueReusableCell?

我原來的Objective-C代碼爲:

static NSString* reuseIdentifier = @"Cell"; 
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    if(!cell) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier]; 
    } 

這裏,所以搜索幾個UITableView問題已經在後,我想將它寫在斯威夫特像這樣:

tableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: "Cell") 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

但是,沒有按讓我說我想要一個subtitle風格。所以,我想這一點:

var cell :UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell") 

,給了我一個subtitle細胞,但它不會讓我dequeueReusableCellWithIdentifier

我已經研究了一些更看着this video tutorial,但他創造的UITableViewCell我以爲是不必要的,因爲我以前完成的對象 - 這同樣效果的獨立subclass

任何想法?謝謝。

+0

能否請你澄清你所說的「它不會讓我'dequeueReusableCellWithIdentifier'」是什麼意思?我不清楚。 – 68cherries

+0

@ 68cherries對不起,我不是故意'功能',不知道叫什麼。方法?基本上,我希望我的單元格可以像我讀過的那樣去隊列,如果使用dequeueReusableCellWithIdentifier,它會重用這些單元格,因此效率更高。 – user3127576

+0

爲什麼不使用與以前相同的代碼?如果使用swift [構造函數]初始化一個新的單元格(https://developer.apple。COM /庫/搶鮮/ IOS /文檔/ UIKit的/參考/ UITableViewCell_Class /#// apple_ref/OCC/instm /的UITableViewCell/initWithStyle:reuseIdentifier :)。 –

回答

55

記住UITableView在功能定義爲可選的,這意味着您的初始單元格聲明需要檢查屬性中的可選屬性。此外,返回的排隊單元格也是可選的,因此請確保您可以選擇投射到UITableViewCell。之後,我們可以強制拆封,因爲我們知道我們有一個單元格。

var cell:UITableViewCell? = 
tableView?.dequeueReusableCellWithIdentifier(reuseIdentifier) as? UITableViewCell 
if (cell == nil) 
{ 
    cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, 
       reuseIdentifier: reuseIdentifier) 
} 
// At this point, we definitely have a cell -- either dequeued or newly created, 
// so let's force unwrap the optional into a UITableViewCell 
cell!.detailTextLabel.text = "some text" 

return cell 
+0

非常感謝,這是如果我被卡住,然後解開!有趣的是,我剛剛看到了來自WWDC的中間Swift演講,他們談論這個展開!再次感謝:) – user3127576

+1

NP。對於我們所有人來說,語法仍然有點棘手,但是使用它越多,語法越自然。 – memmons

+0

我收到致命錯誤:運行此操作時無法展開Optional.None。 –

0

我搞你看看在Github上這個小的UITableView,例如:https://github.com/YANGReal/UITableView-Swift

他們確實喜歡如下:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! 
{ 
    let cell = tableView .dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell 
    cell.textLabel.text = String(format: "%i", indexPath.row+1) 
    // set any other property of your cell here 
    return cell 
} 
+2

這是視頻教程中的人(原始問題中的鏈接)所做的,但我想使用單元格樣式的副標題。爲此,他創建了UITableViewCell的一個單獨的子類,我認爲這是不必要的。至少我希望它是! – user3127576

0

完美的邁克爾·G.埃蒙斯的建議,但在Xcode 6.1使用

if !cell { ..... 

我得到這個錯誤:

Optional type '@|value UITableViewCell?' cannot be used as boolean ; test for '!= nil' instead

接受的語法是:

if cell == nil { ... 
2

您可以使用稍有不同

let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier) as? UITableViewCell ?? UITableViewCell(style: .Subtitle, 
      reuseIdentifier: reuseIdentifier) 

cell.detailTextLabel?.text = "some text" 

return cell 

這是使用的XCode 6.1 7,夫特 1.2 2.0語法,其中UITableView不再是可選的:語法比從memmons所述一個,以防止強制解纏。

+0

Swift 2:cell.detailTextLabel!.text =「some text」 return cell – Roberto

0
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: 
NSIndexPath) -> UITableViewCell { 
    var CellIdentifier:String = "Cell" 
    var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(CellIdentifier) as? UITableViewCell 
    if cell == nil { 
     cell = UITableViewCell(style:UITableViewCellStyle(rawValue:3)!,reuseIdentifier:CellIdentifier) 
     } 
    return cell! 
} 
5
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let reuseIdentifier = "cell" 
    var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier) as UITableViewCell? 
    if (cell == nil) { 
     cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: reuseIdentifier) 
    } 
    cell!.textLabel?.text = self.items[indexPath.row] 
    cell!.detailTextLabel?.text = self.items[indexPath.row] 
    return cell! 
} 
+3

儘管代碼可能會回答這個問題,但請考慮爲其解釋一個更全面的答案 – brodoll

+3

如果我沒有弄錯,應該替換「! =「如果條件爲」==「 – estemendoza

8

僅僅通過清除它斯威夫特2風格在memmons的回答建設中...

let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier) ?? UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: reuseIdentifier) 

cell.detailTextLabel?.text = "some text" 

return cell 

斯威夫特3:

let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) ?? UITableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) 

cell.detailTextLabel?.text = "" 

return cell 
-1

這一個是有點怪。我希望tableView會要求我們返回一個已經註冊到它的單元格的單元格標識符。但是,這並不似乎是案件和下面將呈現出來爲textLabel和detailTextLabel文本的單元格:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: cellId)  
    let user = users[indexPath.row] 
    cell.textLabel?.text = user.name 
    cell.detailTextLabel?.text = user.email 
    return cell 
} 
13

基本上像其他的答案,但我避開對付討厭的自選(你不能通過使用計算出的變量在從SWIFT)-tableView:cellForRow:atIndexPath:返回nil

夫特3

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell: UITableViewCell = { 
     guard let cell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell") else { 
      // Never fails: 
      return UITableViewCell(style: UITableViewCellStyle.value1, reuseIdentifier: "UITableViewCell") 
     } 
     return cell 
    }() 

    // (cell is non-optional; no need to use ?. or !) 

    // Configure your cell: 
    cell.textLabel?.text  = "Key" 
    cell.detailTextLabel?.text = "Value" 

    return cell 
} 

編輯:

實際上,最好使用:tableView.dequeueReusableCell(withIdentifier:for:)來代替。

這以後功能的變種自動實例化一個新的小區,如果沒有人可以重複使用(我的代碼不正是上面明確),因此從未回報nil

-1
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 

    var cell:UITableViewCell? = 
     tableView.dequeueReusableCell(withIdentifier: "cell") 
    if (cell != nil) 
    { 
     cell = UITableViewCell(style: UITableViewCellStyle.subtitle, 
           reuseIdentifier: "cell") 
    } 
    cell!.textLabel?.text = "ABC" 
    cell!.detailTextLabel?.text = "XYZ" 

    return cell! 

    } 
2

由於tableView.dequeueReusableCell(withIdentifier:, for:)返回一個非空單元格中,if cell == nil檢查永遠是假的。 但我找到了一個解決方案,使默認樣式單元格成爲您想要的樣式(值1,值2或字幕),因爲默認樣式單元格的detailTextLabel爲零,因此請檢查detailTextLabel是否爲零,然後創建新樣式單元格並給它出列細胞,如:

斯威夫特3:

var cell = tableView.dequeueReusableCell(withIdentifier: yourCellReuseIdentifier, for: indexPath) 

if cell.detailTextLabel == nil { 
    cell = UITableViewCell(style: .value1, reuseIdentifier: repeatCellReuseIdentifier) 
} 

cell.textLabel?.text = "Title" 
cell.detailTextLabel?.text = "Detail" 

return cell 

這是爲我工作。

希望它的幫助。如果你不使用你自己的自定單元

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "My Reuse Identifier", for: indexPath) 

    cell.textLabel?.text = "Key" 
    cell.detailTextLabel?.text = "Value" 

    return cell 
} 
+0

太棒了!此外,要處理以上警戒語句,請使用:guard let cell = tableView.dequeueReusableCell(withIdentifier:「cell」),cell.detailTextLabel!= nil else {' – HelloimDarius

-1

就用這個斯威夫特3。只需通過代碼註冊UITableViewCell。那麼你可以更喜歡代碼。

否則選擇故事板,選擇您的TableViewCell - >轉到屬性檢查器,並選擇所需的樣式,如下所示。

enter image description here

+1

這不起作用。 – user1366265

0

相關問題