有没有办法一次显示一个UI单元,一次显示另一个UI单元?

时间:2019-04-01 14:08:18

标签: ios swift

我有一个UITableView,它代表带有动态UI单元的问卷。我已经创建了2个单元格。 第一个UI单元需要始终处于顶部(如标题/标题),而第二个UI单元则必须是动态的(这意味着第二个UI单元可以显示10或20个问题)。有什么办法吗?

我已经为两个UI单元创建了一个UITableViewCell,并且我链接了所有组件。 现在,我不知道在何处指定将单元格0返回1次并将单元格1返回X次。 还有如何始终将单元0保持在顶部?

这是一个反映我的问题的打印屏幕: enter image description here

这是我的代码:

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

    switch indexPath.row {

    // Static cell - Checks Left
    case 0:
        let cell = tableView.dequeueReusableCell(withIdentifier: "checksLeftCell", for: indexPath) as! ChecksLeftTableViewCell
        return cell

    // Dynamic cell - Questions
    case 1:
        let cell = tableView.dequeueReusableCell(withIdentifier: Constants.defectAndDamageCell, for: indexPath) as! DefectAndDamageCheckCell
        cell.configCell()
        cell.delegate = self
        return cell
    default:
        return UITableViewCell()
    }
}

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

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

    switch indexPath.row {
    case 0: return 100
    case 1: return 400
    default:
        return 170
    }
}

我希望顶部有“冻结”单元格,第二个是动态单元格。

谢谢您的阅读,希望我能很好地解释一下我的想法。

4 个答案:

答案 0 :(得分:1)

这并不是对设计进行认真思考的标志。看来您根本不需要UITableView。您可以对每个组件使用基本的UIView来获得更好的结果,例如标题,问题详细信息,标签等。

您可以使用UIStackView帮助自己。

答案 1 :(得分:0)

您可以使用带有内部自定义视图的节标题代替静态单元格:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let nameLabel = UILabel(frame: CGRect(x: 10, y: 0, width: tabelView.frame.width, height: 40))
    nameLabel.text = //
    nameLabel.font = taskNameLabel.font.withSize(14)  
    //Or add whatever you need here     
    let sub = UIView(frame: CGRect(x: 0, y: 0, width: tabelView.frame.size.width, height: 40))
    sub.backgroundColor = .white
    sub.addSubview(NameLabel)
    return sub
}
func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: Constants.defectAndDamageCell, for: indexPath) as! DefectAndDamageCheckCell
    cell.configCell()
    cell.delegate = self
    return cell

}

答案 2 :(得分:0)

我会尝试使用UICollectionView而不是tableview。 在UICollectionView中,使用UICollectionViewDelegateFlowLayout委托。

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { #your code for header view }

https://developer.apple.com/documentation/uikit/uicollectionviewdatasource/1618037-collectionview

在TableView中创建节标题,并在其中创建自定义视图。

因此,您的TableView将具有1个节标题和1行。

祝你好运。

答案 3 :(得分:0)

有很多解决方法。

如果您希望将粘贴放在顶部的静态视图,请尝试以下操作: 将UIViewController子类化,并在顶部/前导/尾随处添加容器UIView。将标题标签和内容嵌入到内容视图中。接下来,添加一个UITableView并将其固定在超级视图的开头/结尾/底部。使视图控制器成为数据源和委托。

通过这种方式,您仍然可以在表视图中滚动,并且可以在将静态标头内容作为IBOutlets管理时,根据需要重新加载单元格。

如果将选择的答案与堆栈视图一起使用,则当内容长于屏幕尺寸时,必须通过将堆栈视图嵌入UIScrollView中来实现滚动解决方案。您可能应该只使用tableview,因为该行为是继承的。