在填充标签swift

时间:2017-09-17 16:51:11

标签: ios swift uitableview

我试图在同一滚动视图中以编程方式创建多个UITableView。我正确加载了表格#39;数据到每个数组,但由于某种原因,表填充每隔一个单元格。我在cellForRowAt中添加了一个print语句:确保它不会以某种方式跳过数据而且它似乎并不存在。

另外,didSelectRowAt:当我点击一行时没有被调用,但是didHighlightRowAt:被正确调用。使用它表格单元似乎正确加载,它只是在填充它们时跳过其他每个单元格。

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

    var cellIdentifier = ""

    switch tableView {
    case tableView1:
        cellIdentifier = "AddOnTableViewCell1"
    case tableView2:
        cellIdentifier = "AddOnTableViewCell2"
    case tableView3:
        cellIdentifier = "AddOnTableViewCell3"
    case tableView4:
        cellIdentifier = "AddOnTableViewCell4"
    default:
        print("Too many tables")
    }


    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? AddOnTableViewCell else {
        fatalError("Dequed cell error")
    }

    let titleLabel = UILabel(frame: CGRect(x: 16, y: cell.frame.minY + 10, width: view.frame.width - 30, height: 30))
    titleLabel.textColor = .black
    titleLabel.textAlignment = .left

    switch tableView {
    case tableView1:
        titleLabel.text = addOnContents1[indexPath.row]
        print("\(indexPath.row), \(addOnContents1[indexPath.row])")
    case tableView2:
        titleLabel.text = addOnContents2[indexPath.row]
        print("\(indexPath.row), \(addOnContents2[indexPath.row])")
    case tableView3:
        titleLabel.text = addOnContents3[indexPath.row]
        print("\(indexPath.row), \(addOnContents3[indexPath.row])")
    case tableView4:
        titleLabel.text = addOnContents4[indexPath.row]
        print("\(indexPath.row), \(addOnContents4[indexPath.row])")
    default:
        print("Too many tables")
    }

    cell.addSubview(titleLabel)




    return cell
}

上面的打印陈述显示正确添加的数据对应于indexRow.path,即0是item00,1是item01,2是item02,3是item03,...

然后是这里提到的另外两种方法。

func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) {
    switch tableView {
    case tableView1:
        print(addOnContents1[indexPath.row])
    case tableView2:
        print(addOnContents2[indexPath.row])
    case tableView3:
        print(addOnContents3[indexPath.row])
    case tableView4:
        print(addOnContents4[indexPath.row])
    default:
        print("Too many tables")
    }
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("Pressed")
    switch tableView {
    case tableView1:
        print(indexPath.row)
    case tableView2:
        print(indexPath.row)
    case tableView3:
        print(indexPath.row)
    case tableView4:
        print(indexPath.row)
    default:
        print("Too many tables")
    }

}

最后,这是我设置tableViews的代码

func loadAddOnViews() {
    var count = 1
    for item in addOns {
        var contentSize: CGFloat = 0
        switch count {
        case 1:
            let label = UILabel(frame: CGRect(x: 16, y: yCoordinateForNewContent, width: scrollView.frame.width - 32, height: 50))
            label.text = addOns[0].title
            yCoordinateForNewContent += 50
            scrollView.addSubview(label)
            contentSize = CGFloat(addOnContents1.count)
            print("content size: \(contentSize)")
            contentSize = contentSize * cellSize
            tableView1 = UITableView(frame: CGRect(x: 0, y: yCoordinateForNewContent, width: scrollView.frame.width, height: contentSize))
            scrollView.addSubview(tableView1)
            tableView1.delegate = self
            tableView1.dataSource = self
            self.tableView1.register(AddOnTableViewCell.self, forCellReuseIdentifier: "AddOnTableViewCell1")
            yCoordinateForNewContent += contentSize + 20
            tableView1.reloadData()

        case 2:
            let label = UILabel(frame: CGRect(x: 16, y: yCoordinateForNewContent, width: scrollView.frame.width - 32, height: 50))
            label.text = addOns[1].title
            yCoordinateForNewContent += 50
            scrollView.addSubview(label)
            contentSize = CGFloat(addOnContents2.count)
            print("content size: \(contentSize)")
            contentSize = contentSize * cellSize
            tableView2 = UITableView(frame: CGRect(x: 0, y: yCoordinateForNewContent, width: scrollView.frame.width, height: contentSize))
            scrollView.addSubview(tableView2)
            tableView2.delegate = self
            tableView2.dataSource = self
            self.tableView2.register(AddOnTableViewCell.self, forCellReuseIdentifier: "AddOnTableViewCell2")
            yCoordinateForNewContent += contentSize + 20
            tableView2.reloadData()
        case 3:
            let label = UILabel(frame: CGRect(x: 16, y: yCoordinateForNewContent, width: scrollView.frame.width - 32, height: 50))
            label.text = addOns[2].title
            yCoordinateForNewContent += 50
            scrollView.addSubview(label)
            contentSize = CGFloat(addOnContents3.count)
            print("content size: \(contentSize)")
            contentSize = contentSize * cellSize
            tableView3 = UITableView(frame: CGRect(x: 0, y: yCoordinateForNewContent, width: scrollView.frame.width, height: contentSize))
            scrollView.addSubview(tableView3)
            tableView3.delegate = self
            tableView3.dataSource = self
            self.tableView3.register(AddOnTableViewCell.self, forCellReuseIdentifier: "AddOnTableViewCell3")
            yCoordinateForNewContent += contentSize + 20
            tableView3.reloadData()
        case 4:
            let label = UILabel(frame: CGRect(x: 16, y: yCoordinateForNewContent, width: scrollView.frame.width - 32, height: 50))
            label.text = addOns[3].title
            yCoordinateForNewContent += 50
            scrollView.addSubview(label)
            contentSize = CGFloat(addOnContents4.count)
            print("content size: \(contentSize)")
            contentSize = contentSize * cellSize
            tableView4 = UITableView(frame: CGRect(x: 0, y: yCoordinateForNewContent, width: scrollView.frame.width, height: contentSize))
            scrollView.addSubview(tableView4)
            tableView4.delegate = self
            tableView4.dataSource = self
            self.tableView4.register(AddOnTableViewCell.self, forCellReuseIdentifier: "AddOnTableViewCell4")
            yCoordinateForNewContent += contentSize + 20
            tableView4.reloadData()
        default:
            print("too many tables")
        }
        count += 1
    }
}

这是带有示例数据的屏幕: SimulatorScreen

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

感谢@Naresh引起我的注意。我在AddOnTableViewCell类中声明了标签,但是我在cellForRowAt:方法中创建了一个标签,我将其作为子视图添加到单元格中。我将表简化为一个表,其中包含一组数组来保存数据。我对AddOnTableViewCell类进行了以下更改:

class AddOnTableViewCell: UITableViewCell {

var titleLabel: UILabel!

init(frame: CGRect, title:String) {
    super.init(style: .default, reuseIdentifier: "AddOnTableViewCell")
    titleLabel = UILabel(frame: CGRect(x: 16 , y: self.frame.minY + 10, width: self.frame.width - 32, height: 40))
    titleLabel.textColor = UIColor.black
    titleLabel.text = title
    addSubview(titleLabel)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

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

    // Configure the view for the selected state
}}

我简化了我的cellForRowAt:方法:

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


    let title = tableContents[indexPath.section][indexPath.row]
    let cell = AddOnTableViewCell(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: cellSize), title: title)


    return cell
}

谢谢!