【问题标题】:How to edit UITableViewController如何编辑 UITableViewController
【发布时间】:2019-11-19 01:39:34
【问题描述】:

我创建了一个UITableViewController 的实例,并且我有一些来自 Firebase 的数据显示在单元格中;那里没问题。但我想在UITableViewController(而不是UITableView)的底部添加一个文本字段(用于 cmets)和一个按钮(用于发布该评论)。我选择UITableViewController 而不是UIViewController 然后添加UITableView 的原因是因为如果我这样做,数据将不会显示在我的单元格中。所以,我想知道如何在UITableViewController 的底部编辑/或添加元素。

我尝试以编程方式添加文本字段和按钮,但它不起作用,如果我向 UIViewController 添加表格视图,我只是无法从 Firebase 中正确显示数据。

func setupInputComponents() {
    //x,y,w,h
    let containerView = UIView()
    containerView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(containerView)
    containerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive=true
    containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive=true
    containerView.heightAnchor.constraint(equalToConstant: 50).isActive=true

    //x,y,w,h
    let sendButton = UIButton(type: .system)
    sendButton.setTitle("Post", for: .normal)
    sendButton.translatesAutoresizingMaskIntoConstraints = false
    //klici funkcijo za gumb
    sendButton.addTarget(self, action: #selector(handlePost), for: .touchUpInside)
    containerView.addSubview(sendButton)
    sendButton.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true
    sendButton.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
    sendButton.widthAnchor.constraint(equalToConstant: 80).isActive = true
    sendButton.heightAnchor.constraint(equalTo: containerView.heightAnchor).isActive = true

    //x,y,w,h
    containerView.addSubview(commentInputTextField)
    commentInputTextField.leftAnchor.constraint(equalTo: containerView.leftAnchor, constant: 8).isActive = true
    commentInputTextField.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
    commentInputTextField.rightAnchor.constraint(equalTo: sendButton.leftAnchor).isActive = true
    commentInputTextField.heightAnchor.constraint(equalTo: containerView.heightAnchor).isActive = true        
}

我希望表格视图中填充来自 Firebase 的数据 (cmets),并在手机屏幕底部放置带有按钮的文本字段。

编辑: 如果我尝试使用 UIViewController 和 tableView,这是代码:

    import UIKit
    import Firebase
    class CommentDoOrDieViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return messages.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "commentTableCell", for: indexPath) as? CommentsTableViewCell else {fatalError("error")}
    let message = messages[indexPath.row]
    cell.komentLabela?.text = message.msg
    return cell
}


override func viewDidLoad() {
    super.viewDidLoad()
    tabela.dataSource = self
    tabela.delegate = self
    showComments()
}

struct Message {
    var msg: String?
    var id: String?
}
var messages = [Message]()

var productId = ""
var productName = ""

@IBOutlet weak var tabela: UITableView!




func showComments(){
    let ref = Database.database().reference().child("productComments").child(productId)
    ref.observe(.childAdded, with: { (snapshot) in

        print(snapshot)

        if let slovar = snapshot.value as? [String:AnyObject] {
            var a = Message()
            a.msg = slovar["comment"] as? String
            a.id = slovar["userId"] as? String
            self.messages.append(a)
            DispatchQueue.main.async {
                self.tabela.reloadData()
            }
        }
    }, withCancel: nil)
}

【问题讨论】:

  • UIViewController 将是一个更好的选择,以防您想在控制器视图中拥有除 tableView 之外的任何其他内容。
  • 我认为你不能在UITableViewController 的底部添加粘性视图(或按钮等)。您应该使用UIViewController 并创建UITableView
  • 我看不出为什么UIViewController 中的UITableView 不能在UITableViewController 中工作,而且你最好使用前者。也许您可以详细说明尝试使用UIViewController 时发生的情况。

标签: ios swift firebase uitableview uiviewcontroller


【解决方案1】:

我认为您不能正确执行此操作,因为在UITableViewController 的情况下self.viewUITableView。 您可以尝试通过viewheaderfooter 执行此操作,或者将UITableViewController 替换为UIViewController。在屏幕顶部添加UITableView,在底部添加textField和按钮

已编辑

如果是UIViewController,请务必附加UITableViewDataSource

【讨论】:

  • 我知道,那是我的第一选择,但我就是无法在 UITableView 中显示数据,我花了 2 天多的时间试图弄清楚,然后我放弃并使用了 UITableViewController并让它在几分钟内工作没问题。
  • 您是否附加了UITabableViewDataSource of UITableView
  • 是的,我浏览了 5 或 6 个 youtube 教程和几篇关于 stackoverflow 的文章,一切看起来都还不错,但就是没有用。我会从头开始再试一次,看看结果如何
  • 我更新了我的答案,如果你做了一切应该在图像上工作的事情。如果没有,请在numberOfRowsInSection 上添加调试断点并检查项目数
  • 我明白了,非常感谢你,我会尝试一下,希望它有效。再次感谢您的快速回复
【解决方案2】:

单元格的数量是变化还是恒定。如果它是恒定的,您可以尝试在最后显示的单元格中创建一个文本视图以及一个按钮以及您需要的所有其他内容。这样做的一个好方法是创建两个类,一个用于普通单元格,另一个用于带有文本视图的最后一个单元格。如果您更改单元格的数量,我认为您仍然可以创建类,但我不确定您将如何确保单元格保持在底部。

使用这种方法,代码更易于管理,定制也更容易。

【讨论】:

    【解决方案3】:

    下面的解决方案可能会有所帮助... 尝试将下面的代码放在要重新加载表格的代码上方(在 showComments() 中)。

    tabela.dataSource = self
    tabela.delegate = self
    

    【讨论】:

    • 哇,这确实有效。非常感谢你,你是救命稻草 :) 我不得不说我不明白为什么我必须将委托和数据源放在 showComments() 中,但只要它有效,我就很高兴!
    • 感谢上帝,我的第一个答案帮助了一些人。原因是当您在 Didload() 方法上调用您的代表时,它首先调用它,然后它还调用委托函数,因此它可以并行工作首先你的消息数组是空的,这就是为什么它没有显示任何东西。
    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 2011-04-18
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多