Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITableView单元格未添加到屏幕底部下方_Ios_Swift_Uitableview - Fatal编程技术网

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

Ios UITableView单元格未添加到屏幕底部下方,ios,swift,uitableview,Ios,Swift,Uitableview,我试图在UItableview中动态插入行,以允许用户输入列表。插入新行一直有效,直到我到达tableview的底部。当我到达底部时,会触发致命错误,因为单元格的类型错误,这似乎是由于insert语句未执行所致 以下是我的tableview代码: // // TextEntryViewController.swift // GroceryPlanner // // Created by Taygan Caldwell on 1/18/19. // Copyright © 2019 Non

我试图在UItableview中动态插入行,以允许用户输入列表。插入新行一直有效,直到我到达tableview的底部。当我到达底部时,会触发致命错误,因为单元格的类型错误,这似乎是由于insert语句未执行所致

以下是我的tableview代码:

//
//  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
    }
}
//
//TextEntryViewController.swift
//杂货商
//
//泰根·考德威尔于19年1月18日创作。
//版权所有©2019无。版权所有。
//
导入UIKit
类TextEntryViewController:UIViewController、UITextFieldDelegate、UITableViewDataSource、UITableViewDelegate{
//马克:财产
@IBVAR保存:uibarbuttoneim!
@IBVAR表格视图:UITableView!
var enteredItems=[String]()
重写func viewDidLoad(){
super.viewDidLoad()
tableView.dataSource=self
tableView.delegate=self
//加载视图后执行任何其他设置。
updateSaveButton()
}
//MARK:TableView方法
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回enteredItems。计数+1
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
让CellIdentifier=“InputableViewCell”
guard let cell=tableView.dequeueReusableCell(标识符:CellIdentifier,for:indexPath)作为?InputableViewCell else{
fatalError(“错误的单元格类型”)
}
cell.input.delegate=self
cell.input.tag=indexPath.row
如果indexath.rowBool{
textField.resignFirstResponder()辞职
让indexPath=indexPath(行:enteredItems.count,节:0)
tableView.insertRows(位于:[indexPath],带:。自动)
guard let cell=tableView.cellForRow(at:indexPath)作为?InputableViewCell else{
fatalError(“错误的单元格类型”)
}
cell.input.becomeFirstResponder()的
返回真值
}
func textField编辑(textField:UITextField){
textField.resignFirstResponder()辞职
如果textField.text!“”{
插入(textField.text!,位于:enteredItems.count)
}
//刷新表
/*
self.tableView.reloadData()
let cell=getCell(enteredItems.count)
如果cell.input.text!“”{
cell.input.text=“”
}
*/
//如果至少有一项,则启用“保存”按钮
updateSaveButton()
}
func textField didbeginediting(textField:UITextField){
让index=textField.tag
let cell=getCell(索引)
cell.becomeFirstResponder()
如果索引inputableviewcell{
设indexPath=indexPath(行:索引,节:0)
guard let cell=tableView.cellForRow(at:indexPath)作为?InputableViewCell else{
fatalError(“错误的单元格类型”)
}
返回单元
}
}

这应该在方法
insertRows

  if textField.text != ""{
       enteredItems.insert(textField.text!, at: enteredItems.count)
  }
当您按下return
func textfielddidediting(\utextfield:UITextField)

  • 在键盘上按return键时,将调用textFieldShouldReturn。然后
  • 更新输入的项目。然后
  • 在tableview中插入新行
  • 更新 4.cellForRowAtIndexpath只提供可见的单元格。 5.如果tableview到达底部,则每次插入时都必须调用tableview.scrollToBottom。然后您可以获取最后一个索引的单元格


    通过这种方式,您将不会出现致命错误

    这其实不是问题。似乎斯威夫特在textField返回之前调用了textFieldEndEditing。当我到达页面底部时,会发生致命错误。它会一直工作到列表的大小达到15为止。当单元格大小达到15时,将不插入单元格,并触发单元格变量的保护语句中的else。15单元格到达底部后。所以你不能太看它。您可以滚动到最后一个索引。将调出最后一个单元格。但请确保在插入indexpath之前,必须更新这些项。查看我的编辑