当标签文本发生更改时,重新计算UITableViewCell的高度

时间:2017-04-19 01:55:12

标签: ios uitableview tableviewcell rx-swift

因此,当标签文字发生变化时,我在更新01010101 10101010 00001111 的高度方面遇到了问题。

我不善于解释事情,因此我在Github创建了一个回购,以便您可以抓住并运行。当您向上和向下滚动表格视图时(以使单元格重复使用),该问题应该会出现。

我做的是

  • 我创建了一个包含自定义单元格的表格视图。
  • 每个单元格中都有UITableViewCell
  • 我有一个视图模型,可以决定UILabel中的内容。
  • 我使用UILabel在视图模型中注册更改,并相应地更新RxSwift的文本。
  • 同时,单元格会询问其代理人(在这种情况下,UITable)重新计算其高度。
  • 然后,代理人会拨打UITableViewControllertableView.beginUpdates来更新单元格的高度。

结果

  • 当我向上滚动表格视图以便第一个单元格被重用时,然后向下滚动。第一个单元格的内容在表格视图中重复(第二个单元格与第一个单元格重复。)

我尝试了什么

  • 我试着打电话给tableView.endUpdates。 - >无限循环
  • 我试着致电tableView.reloadData() - >这有效,但我不知道为什么。

我想要实现的目标:

  • 我想把Rx和MVVM放在一起,因为我喜欢Rx的工作方式。
  • 我希望能够更改单元格的标签文本,并且可以更新单元格的高度以适合文本。

一些代码段:(虽然最好还是检查一下这个回购。):

单元格注册视图模型

tableView.reloadRows()

在UITableViewController中委派方法

override func awakeFromNib() {
    super.awakeFromNib()

    viewModel.title
        .observeOn(MainScheduler.instance)
        .subscribe(onNext: { [weak self] title in
            guard let cell = self else { return }

            cell.label.text = title
            cell.delegate?.requestSizeRecalculate(cell: cell)
        })
        .disposed(by: disposeBag)
}

这是我第一次在Stackoverflow上提问。我知道我可能会让事情变得更加复杂。但如果有人可以根据您的经验提出任何建议,我将非常感激!

2 个答案:

答案 0 :(得分:1)

你可以这样做:

int removeVowels(char arr[]) {
    char *temp = malloc(strlen(arr) + 1);
    int i;
    int total = 0;
    int pos = 0;
    for ( i = 0; arr[i] != '\0'; i++) {
        if (arr[i] == 'a' || arr[i] == 'e' || arr[i] == 'o' || arr[i] == 'i' || arr[i] == 'u')
             total++;
        else
             temp[pos++] = arr[i]; 
    }
    temp[pos] = '\0';
    strcpy(arr, temp);
    free(temp);
    return total;
}

答案 1 :(得分:-1)

我见过你的代码。现在你不需要计算行的高度。当你给出top,leading,bottom和Trailing约束时。 Xcode将根据标签高度计算标签高度并增加单元尺寸。你需要传递一个方法。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{

   return UITableViewAutomaticDimension
}

你已经完成了所有事情。你需要写上面的方法。现在不要求这种方法。

extension ViewController: SimpleCellDelegate {
    func requestSizeRecalculate(cell: SimpleCell) {
        print("Size recalculating....")

我已在此链接上上传了您的项目并进行了更改。在数组中添加了1个大文本来测试自我调整大小。

Self Sizing Tableview

这是Out的截图: -

我希望这个答案对你有所帮助。

enter image description here