2016-11-29 178 views
0

我是新來iOS開發,我想創建自定義tableViewCells,但我有一個問題。我有3個部分爲我的tableViewCell和一個數組。當我嘗試將值分配給UITableView, cellForRowAt的單元格時,它從每個部分的頂部開始數組。 這裏是我的代碼:自定義tableViewCell

import Foundation 
import UIKit 

struct cellData { 

let cell : Int! 
let text : String! 
} 

class SettingsTableViewCell : UITableViewController{ 

var arrayOfCellData = [cellData]() 

override func viewDidLoad() { 

    arrayOfCellData = [cellData(cell : 1, text : "تغییر رنگ دکمه تنظیمات"), 
         cellData(cell : 2, text : "تغییر تصویر پشت زمینه"), 
         cellData(cell : 1, text : "تغییر رنگ قلم"), 
         cellData(cell : 2, text : "اعلانات"), 
         cellData(cell : 2, text : "صداها"), 
         cellData(cell : 2, text : "زبان"), 
         cellData(cell : 2, text : "بازگشت به حالت پیش فرض"), 
         cellData(cell : 2, text : "سوالات متداول")] 


} 

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 3 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    if section == 0{ 
     return 3 
    } 
    else if section == 1{ 
     return 4 
    } 
    else if section == 2{ 

     return 1 
    } 


    return arrayOfCellData.count 
} 

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

    if arrayOfCellData[indexPath.row].cell == 1{ 


     let cell = Bundle.main.loadNibNamed("TableViewCell_Type1", owner: self, options: nil)?.first as! TableViewCell_Type1 

     cell.cellName_1.text = arrayOfCellData[indexPath.row].text 

     return cell 

    } 
    else if arrayOfCellData[indexPath.row].cell == 2{ 

     let cell = Bundle.main.loadNibNamed("TableViewCell_Type2", owner: self, options: nil)?.first as! TableViewCell_Type2 

     cell.cellName_2.text = arrayOfCellData[indexPath.row].text 

     return cell 


    } 
    else{ 

     let cell = Bundle.main.loadNibNamed("TableViewCell_Type1", owner: self, options: nil)?.first as! TableViewCell_Type1 

     cell.cellName_1.text = arrayOfCellData[indexPath.row].text 

     return cell 


    } 



} 

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 



    if section == 0{ 
     return "تنظیمات رنگ\n" 
    } 
    else if section == 1{ 
     return "تنظیمات سیستم\n" 
    } 
    else if section == 2{ 

     return "پشتیبانی\n" 
    } 

    return "" 
    } 
} 
+1

不要使用像「Bundle.main.loadNibNamed」這樣的舊編碼方式,而應使用「registerNib」來幫助您創建單元格。另外,你可以發佈你的問題的屏幕截圖嗎? – Satyam

+0

在'cellForRowAtIndexPath'中,您只考慮索引路徑的行。因此,每個部分顯示數組頂部的相同對象。此外,你可以在Interface Builder中設計多個自定義單元格(我猜是自Xcode 6以來),不需要額外的筆尖。最後不要硬編碼'numberOfRows'。用嵌套數組或其他東西創建一個合適的模型,以便始終使用'count'屬性。 – vadian

+0

您不能只考慮'indexPath.row',根據'indexPath.section'和'indexPath.row'計算數組索引。然後你會從數組中得到確切的元素。 –

回答

0

我改變了我的代碼,這樣一來,它的工作!

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

    var offset = 0 

    if indexPath.section == 0 { 

     offset = 0 

    } else if indexPath.section == 1 { 

     offset = 3 

    } else if indexPath.section == 2 { 

     offset = 7 

    } 


    if arrayOfCellData[indexPath.row + offset].cell == 1 { 


     let cell = Bundle.main.loadNibNamed("TableViewCell_Type1", owner: self, options: nil)?.first as! TableViewCell_Type1 

     cell.cellName_1.text = arrayOfCellData[indexPath.row + offset].text 

     return cell 

    } 
    else if arrayOfCellData[indexPath.row + offset].cell == 2 { 

     let cell = Bundle.main.loadNibNamed("TableViewCell_Type2", owner: self, options: nil)?.first as! TableViewCell_Type2 

     cell.cellName_2.text = arrayOfCellData[indexPath.row + offset].text 

     return cell 


    } 
    else { 

     let cell = Bundle.main.loadNibNamed("TableViewCell_Type1", owner: self, options: nil)?.first as! TableViewCell_Type1 

     cell.cellName_1.text = arrayOfCellData[indexPath.row + offset].text 

     return cell 

     } 
0

代替arrayOfCellData [indexPath.row],試試這個數組來計算正確的索引:

var idx = indexPath.row 
    if indexPath.section == 1 { idx += 3 } 
    else if indexPath.section == 2 { idx += 7 } 

    // and then you can use: 
    arrayOfCellData[idx] 
+0

使用你的解決方案後,我有一個編譯器錯誤。它抱怨這個錯誤:二元運算符'=='不能應用於類型'section.Type'和'Int'的操作數 – fatemeh

+0

@fatemeh當你想使用'=='時,你應該在2個值上使用它相同的類型。我不知道'section.Type'是什麼,但是'Int'顯然是一個整數。所以要確定你比較的是同一類型的。你可以隨時在一個變量上「Ctrl + click」來查看它的類型。 fahmidin? – Honey

+0

@fatemeh部分是indexPath.section。我認爲這很明顯。我編輯了代碼。 – Gabriel

1

這是一個建議用更方便的數據源

  • 創建單元格類型的枚舉

    enum CellType { 
        case one, two 
    } 
    
  • CellData struct包含節的標題,單元格類型的數組以及文本字符串的數組。

    struct CellData { 
        let title : String 
        let typeArray : [CellType] 
        let textArray : [String] 
    } 
    
  • 聲明數據源陣列

    var arrayOfCellData = [CellData]() 
    
  • viewDidLoad創建3個部分。對於textArray項目使用西文本,我很抱歉,因爲我對左右文本行爲感到困惑)。

    override func viewDidLoad() { 
        super.viewDidLoad() 
        let section0 = CellData(title: "تنظیمات رنگ\n", typeArray: [.one, .two, .one], textArray: ["Text 1", "Text 2", "Text 3"]) 
        let section1 = CellData(title: "تنظیمات سیستم\n", typeArray: [.two, .two, .two, .two], textArray: ["Text 4", "Text 5", "Text 6", "Text 7"]) 
        let section2 = CellData(title: "پشتیبانی\n", typeArray: [.two], textArray: ["Text 8"]) 
    
        arrayOfCellData = [section0, section1, section2] 
    } 
    

現在的數據源和委託方法更容易填充。
下面的代碼假定兩個細胞直接在Interface Builder設計名爲TableViewCell_Type1TableViewCell_Type2自定義類和和相應的標識符Type1Type2

override func numberOfSections(in tableView: UITableView) -> Int { 
     return arrayOfCellData.count 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     let section = arrayOfCellData[section] 
     return section.textArray.count 
    } 


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

     let section = arrayOfCellData[indexPath.section] 
     let text = section.textArray[indexPath.row] 
     let cellType = section.typeArray[indexPath.row] 


     switch cellType { 
     case .one: 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Type1", for: indexPath) as! TableViewCell_Type1 
      cell.cellName_1.text = text 
      return cell 

     case .two: 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Type2", for: indexPath) as! TableViewCell_Type2 
      cell.cellName_2.text = text 
      return cell 

     } 
    } 


    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 

     let section = arrayOfCellData[section] 
     return section.title 
    } 
+0

你的答案有'dequeueReusableCellWithIdentifier'。她的不是!有沒有什麼辦法,甚至可以沒有這樣的工作?! – Honey

+1

我特意編寫了可重用單元的代碼,因爲它更容易實現。不幸的是,許多教程都提出了更繁瑣(和古老)的方法。 – vadian