如何将UITextView添加到UITableView的底部

时间:2019-03-19 08:47:52

标签: swift uitableview uitextview

我有一个项目,必须在一个屏幕上显示很多信息。它不是太多的信息,但是实现起来很复杂。出于这个问题的目的,我建议看一下this screenshot,它将说明我想要实现的目标。

我目前使用UIViewController设置此屏幕,其中包含一个UITableView,其中使用自动布局作为中间部分固定到视图的顶部,底部,前导和尾随锚。这很好。然后,我添加了一个tableHeaderView,其中包含有关用户的信息。现在,我刚刚在UITableView中添加了第二个tableFooterView,而且令人惊讶的是,它也像一个符咒一样工作。我在设置高度时遇到了一些麻烦,但是我设法通过viewDidLayoutSubviews()方法来完成它。但这有点题外话。

我现在处于最后阶段,我想与UITextView一起添加UIButton(在UIView容器中)以允许用户添加评论。最初,我在tableFooterView中添加了它,然后它起作用了,但是一旦内容太短(例如,中间只有一行,还没有评论),UITextView就会出现在屏幕中间(直接位于UITableView的内容下方)。我仔细阅读了一下,发现它是tableFooterView的预期行为,所以我现在试图找出一种方法来添加此自定义视图,以添加将始终的注释如果内容未填满整个屏幕,则在底部;如果内容大于屏幕大小,则也将与内容一起滚动。 (理想情况下,我希望能够在用户输入文本时增大或缩小UITextView,在有人建议contentInsets的情况下可能是相关的。)

有什么建议吗?我是否应该将子视图直接添加到UITableView中(据我所读,不建议这样做)?我应该在UITableView上使用contentInsets并将UIView容器添加为主要UIViewController的子视图吗?在没有找到正确解决方案的情况下搜索多个解决方案后,我有些失落,所以希望大家能帮帮我。干杯!

2 个答案:

答案 0 :(得分:0)

添加UITextView很麻烦,因为就像UIScrollView一样,它是UITableView的子类,并且将滚动视图添加到另一个滚动视图不仅使手势识别器难以处理,而且还可以进行自动布局。

让您的生活更轻松的是,在视图控制器中只有一个表视图,其中包含不同的节,并且每个节具有不同类型的单元格。

为此,我想在视图控制器中声明一个enum

class MyViewController: UIViewController {
    private enum Section: Int, CaseIterable {
        case foo
        case bar
    }
}

extension MyViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return Section.allCases.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        guard let section = Section(rawValue: section) else { preconditionFailure() }

        switch section {
        case .foo:
            return 1
        case .bar:
            return 4
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let section = Section(rawValue: indexPath.section) else { preconditionFailure() }

        let cell: UITableViewCell
        switch section {
        case .foo:
            cell = ...
        case .bar:
            cell = ...

        return cell
    }
}

对于具有长文本的单元格,您只需使用default单元格样式(在XIB / storyboard中)并设置

cell.textLabel?.numberOfLines = 0

表格视图应该能够自动调整其大小以适合整个文本。

在方案中需要使用UITextView的唯一原因是,如果您希望用户能够编辑文本。否则,可以省下很多痛苦,并选择UILabel

答案 1 :(得分:-1)

您应该在主屏幕底部添加单独的UIView,并将UITextView添加为其中的子视图。 在此容器视图上方添加TableView,以便其滚动,并且textview始终在底部可见。