UITableView Ячейка не добавлена ​​ниже нижней части экрана - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь динамически вставлять строки в UItableview, чтобы позволить пользователям вводить список.Вставка новых строк работает, пока я не доберусь до конца таблицы.Когда я достигаю дна, моя фатальная ошибка срабатывает, потому что ячейка имеет неправильный тип, это, кажется, вызвано тем, что оператор вставки не выполняется.

Вот мой код для просмотра таблицы:

//
//  TextEntryViewController.swift
//  GroceryPlanner
//
//  Created by Taygan Caldwell on 1/18/19.
//  Copyright © 2019 None. All rights reserved.
//

import UIKit

class TextEntryViewController: UIViewController,UITextFieldDelegate,UITableViewDataSource,UITableViewDelegate {
    //MARK: Properties
    @IBOutlet weak var save: UIBarButtonItem!
    @IBOutlet weak var tableView: UITableView!
    var enteredItems=[String]()
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource=self
        tableView.delegate=self
        // Do any additional setup after loading the view.
        updateSaveButton()
    }
    //MARK: TableView Methods
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return enteredItems.count+1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cellIndentifier="InputTableViewCell"
        guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIndentifier, for: indexPath) as? InputTableViewCell else{
            fatalError("wrong cell type")
        }
        cell.input.delegate=self
        cell.input.tag=indexPath.row
        if indexPath.row < enteredItems.count{
            cell.input.text=enteredItems[indexPath.row]
        }
        return cell
    }
    //MARK: UITextFieldDelegate
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        let indexPath=IndexPath(row:enteredItems.count ,section:0)
        tableView.insertRows(at: [indexPath], with: .automatic)
        guard let cell=tableView.cellForRow(at: indexPath) as? InputTableViewCell else{
            fatalError("wrong cell type")
        }
        cell.input.becomeFirstResponder()
        return true
    }
    func textFieldDidEndEditing(_ textField: UITextField) {
        textField.resignFirstResponder()
        if textField.text != ""{
            enteredItems.insert(textField.text!, at: enteredItems.count)
        }
        //refresh table
        /*
        self.tableView.reloadData()
        let cell=getCell(enteredItems.count)
        if cell.input.text != ""{
            cell.input.text=""
        }
        */
        //enable save button if there is a least one item
        updateSaveButton()
    }
    func textFieldDidBeginEditing(_ textField: UITextField) {
        let index=textField.tag
        let cell=getCell(index)
        cell.becomeFirstResponder()
        if index < enteredItems.count{
         enteredItems.remove(at: index)
        }
    }
    //MARK: Navigation

    @IBAction func cancel(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }
    // This method lets you configure a view controller before it's presented.
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let button=sender as? UIBarButtonItem, button===save else{
            print("save button not pressed")
            return
        }
    }
    //MARK: Private Methods
    private func updateSaveButton(){
        save.isEnabled = !enteredItems.isEmpty
    }
    private func getCell(_ index:Int)->InputTableViewCell{
        let indexPath=IndexPath(row: index,section:0)
        guard let cell=tableView.cellForRow(at: indexPath) as? InputTableViewCell else{
            fatalError("wrong cell type")
        }
        return cell
    }
}

Ответы [ 2 ]

0 голосов
/ 30 января 2019
  1. textFieldShouldReturn будет вызываться при нажатии клавиши возврата на клавиатуре.затем
  2. обновить введенные позиции.затем
  3. вставьте новую строку в табличное представление.

Обновление 4. cellForRowAtIndexpath дает только видимую ячейку.5. если tableview достигает дна, то при каждой вставке вы должны вызывать tableview.scrollToBottom.тогда вы можете получить ячейку для последнего indexpath

Поступая таким образом, вы не окажетесь в фатальной ошибке.

0 голосов
/ 30 января 2019

Это должно выполняться перед методом insertRows

  if textField.text != ""{
       enteredItems.insert(textField.text!, at: enteredItems.count)
  }

Этот метод не вызывается при нажатии return func textFieldDidEndEditing(_ textField: UITextField)

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