2016-09-23 205 views
1

我试图以编程方式实现一个表视图单元格中的堆栈视图与标签和按钮添加到它,像这样:堆栈视图在表视图细胞

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    let dict = self.char[indexPath.row] 
    let stackView = UIStackView() 
    stackView.translatesAutoresizingMaskIntoConstraints = false 
    stackView.axis = .horizontal 
    stackView.spacing = 20 
    stackView.distribution = .fillProportionally 
    stackView.alignment = .leading 
    cell.addSubview(stackView) 
    NSLayoutConstraint.activate([ 
     stackView.leadingAnchor.constraint(equalTo: cell.leadingAnchor), 
     stackView.trailingAnchor.constraint(equalTo: cell.trailingAnchor) 
     ]) 
    let bornLabel = UILabel() 
    bornLabel.textColor = UIColor.blue 
    let bornLabelValue = UILabel() 
    bornLabelValue.textColor = UIColor.blue 
    stackView.addArrangedSubview(bornLabel) 
    stackView.addArrangedSubview(bornLabelValue) 
    for (key, value) in dict { 
     bornLabel.text = key 
     bornLabelValue.text = value 
     if key == "Height" { 
      let button = UIButton(type: .roundedRect) 
      button.setTitle("English", for: .normal) 
      button.setTitleColor(.blue, for: .normal) 
     stackView.addArrangedSubview(button) 
     } 
    } 
    return cell 
} 

的问题是,每次tableView.reloadData()被称为,另一个单元格被添加到现有的单元格的顶部,每个标签具有不同的值,具体取决于提供给tableView的数据。或者它可能不会每次生成另一个单元,但只需添加另一个堆栈视图。我不确定。我怎样才能解决这个问题?

感谢

回答

2

的问题是,你得到一个“可重复使用的电池”,这意味着这将是一个空的单元中的第几次,然后它会是一个细胞,你已经增加了一个UIStackView

你应该做一个新的原型细胞,无论是通过Storyboard或新XIB文件,在其中加入了UIStackView,然后只配置stackView在cellForRowAt indexPath:实现。

或者你可以从技术上在stackView中设置一个标签,然后检查该标签的单元格......但请不要这样做。

+1

您的回答让我找到了正确的地方,谢谢。我通过确实使用原型单元格,添加了一个stackview并在'cellForRowAt indexPath:'中配置stackview来解决它。我曾尝试过,并且在'cellForRowAt indexPath:'中实例化了我的标签和按钮,而不是在我的自定义单元类中,现在它完美地工作。谢谢! – user2747220

1

尝试添加stackView在cell.contentView

我的目标-C这样的人还没有学会迅速呢。

在目标C中,我们检查条件,如果在实例化之前单元是零或不是。

ex。

if(cell == nil) 
{ 
    # Instantiate cell here 
} 

by this cell will not instantiate for each row of indexPath。