UITableView单元格未添加到屏幕底部下方

时间:2019-01-30 20:11:42

标签: ios swift uitableview

我正在尝试将行动态插入UItableview中,以允许用户输入列表。插入新行直到我到达表格视图的底部为止。当我到达最底端时,由于单元格类型错误,将触发致命错误,这似乎是由于未执行insert语句引起的。

这是表格视图的代码:

//
//  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 :(得分:1)

这应该在方法insertRows

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

当您按回车键func textFieldDidEndEditing(_ textField: UITextField)

时,不会调用此方法

答案 1 :(得分:0)

    当您在键盘上按回车键时,将调用
  1. textFieldShouldReturn。然后
    1. 更新输入的项目。然后
    2. 在表格视图中插入新行。

更新 4. cellForRowAtIndexpath仅给出可见的单元格。 5.如果tableview到达底部,则在每次插入时都必须调用tableview.scrollToBottom。那么您可以获取最后一个索引路径的单元格

通过这种方式,您不会陷入致命错误。