自定义tableViewCell

时间:2016-11-29 14:09:41

标签: ios arrays uitableview swift3 cell

我是iOS开发新手,我尝试创建自定义tableViewCells,但我遇到了问题。我有3个部分用于我的tableViewCell和一个数组。当我尝试为UITableView, cellForRowAt的单元格赋值时,它从每个部分的顶部开始数组。 这是我的代码:

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

3 个答案:

答案 0 :(得分:1)

这是一个带有更方便数据源的建议

  • 为单元格类型创建枚举

    enum CellType {
        case one, two
    }
    
  • CellData结构包含节的标题,单元格类型的数组和文本字符串的数组。

    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
    }

答案 1 :(得分: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]

答案 2 :(得分: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

        }
相关问题