Как редактировать UITableViewController - PullRequest
0 голосов
/ 09 июля 2019

Я создал экземпляр 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 и текстовым полем с кнопкой, которая будет размещена в нижней части экрана телефона.

EDIT: это код, если я пытаюсь с 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)
}

Ответы [ 3 ]

0 голосов
/ 09 июля 2019

Меняется ли количество ячеек или оно постоянно.Если он постоянен, вы можете попробовать создать текстовое представление в последней отображаемой ячейке вместе с кнопкой и всем остальным, что вам нужно.Хороший способ сделать это - создать два класса, один для обычных ячеек, а другой для последней ячейки с текстовым представлением.Если вы измените число ячеек, я думаю, что вы все еще можете создать классы, но я не уверен, как вы бы обеспечили, чтобы ячейка оставалась внизу.

Используя этот метод, код становится более управляемым и значительно упрощает настройку.Полегче.

0 голосов
/ 09 июля 2019

Может быть, это решение может помочь ... попробуйте поместить приведенный ниже код над кодом, в который вы перезагружаете таблицу (в showComments ()).

tabela.dataSource = self
tabela.delegate = self
0 голосов
/ 09 июля 2019

Я не думаю, что вы можете сделать это правильно, так как в случае UITableViewController self.view это UITableView. Вы можете попытаться сделать это с помощью header или footer из view или заменить UITableViewController на UIViewController. Добавьте UITableView вверху экрана и textField и кнопку внизу

EDITED

в случае UIViewController убедитесь, что вы приложили UITableViewDataSource

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...