我创建了UITableViewController
的实例,并从Firebase中获得了一些显示在单元格中的数据;没问题。但是我想在UITableViewController
(而不是UITableView
)的底部添加一个文本字段(用于注释)和一个按钮(用于发布该注释)。之所以选择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中的数据(注释),并在文本字段中使用按钮放置在手机屏幕的底部。
编辑: 如果我尝试使用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)
}
答案 0 :(得分:0)
我认为您不能正确执行此操作,因为在UITableViewController
self.view
为UITableView
的情况下。
您可以尝试通过header
的{{1}}或footer
来执行此操作,或将view
替换为UITableViewController
。在屏幕顶部添加UIViewController
,在底部添加textField和按钮
已编辑
对于UITableView
,请确保您附加了UIViewController
答案 1 :(得分:0)
单元格的数目是否改变或恒定?如果常量不变,则可以尝试在最后显示的单元格中创建文本视图以及按钮和此处需要的所有其他内容。一个好的方法是创建两个类,一个用于普通单元格,另一个用于最后一个带有文本视图的单元格。如果您要更改单元格的数量,我认为您仍然可以创建类,但是我不确定如何确保单元格停留在底部。
使用此方法,代码更易于管理,并使自定义更加容易。
答案 2 :(得分:0)
以下解决方案可能会帮助您... 尝试将以下代码放在要重新加载表的代码上方(在showComments()中)。
tabela.dataSource = self
tabela.delegate = self