tableview选择行后重新加载数据无限循环

问题描述:

我有一个tableView与每个单元格中的textField列表,我使用UITextFieldDelegate。 用户可以写他想要的并添加行。tableview选择行后重新加载数据无限循环

的问题是实现代码如下必须重新加载到结果显示给用户,但它打破becomeFirstResponder()...

我已经尝试此解决方案self.tableView.reloadData()后:

let cell = self.tableView.dequeueReusableCell(withIdentifier: Cell.identifier, for: IndexPath(item: 0, section: 0)) as! Cell 
textFieldDidBeginEditing(cell.textFiedl) 
let cell = tableView(self.tableView, cellForRowAt: indexPath) as! CellItemOptions 
cell.nameOptionsItem.becomeFirstResponder() 
let cell = self.tableView.cellForRow(at: indexPath) as! CellItemOptions 
cell.nameOptionsItem.becomeFirstResponder() 

但它不起作用。

谢谢你的帮助!

编辑:我的代码

import UIKit 

class OptionsItemViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate { 

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
    var textFiedlDelegate: UITextField? = nil 
    var categorySelected: Category? 
    var options: [String] = [] 
    var nameOptions: [String] = [] 
    var cellSelected: Int = 0 
    var viewHeight: CGFloat = 0 
    var selectedRow: IndexPath? = nil 
    var tableviewNeedToReload: Bool = false 

    @IBOutlet weak var tableView: UITableView! 
    @IBOutlet weak var keyboardAlwaysShow: UITextField! 
    @IBOutlet weak var newFeatureButton: UIBarButtonItem! 

    private let db = DataBase() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.dataSource = self 
     self.textFiedlDelegate?.delegate = self 
     self.title = categorySelected!.name 
     NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     db.getItemOptions(predicateFormat: "id == \(self.categorySelected!.id)", completion: { results in 
      self.categorySelected = results.first! 
      self.options = self.categorySelected!.options as! [String] 
      DispatchQueue.main.async { 
       self.tableView.reloadData() 
      } 
     }) 
    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(false) 
     self.viewHeight = self.view.frame.size.height 
    } 

    override func viewDidDisappear(_ animated: Bool) { 
     super.viewDidDisappear(false) 
     var index = 0 
     while index < self.options.count { 
      if self.options[index] != "" { 
       index += 1 
      } else { 
       self.options.remove(at: index) 
      } 
      db.setCategoryOptions(category: self.categorySelected!, options: self.options, index: cellSelected) 
     } 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.view.endEditing(true) 
    } 

    @IBAction func newFeature(_ sender: Any) { 
     if self.options.last != "" { 
      let indexPath: IndexPath = IndexPath(row: self.options.count, section: 0) 
      self.options.append("") 
      self.tableView.reloadData() 

      let cell = tableView(self.tableView, cellForRowAt: indexPath) as! CellItemOptions 
      cell.nameOptionsItem.becomeFirstResponder() 
     } 
    } 

    // MARK: - TableView Functions 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return options.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let option = options[indexPath.row] 
     let cell = tableView.dequeueReusableCell(withIdentifier: CellItemOptions.identifier, for: indexPath) as! CellItemOptions 
     cell.nameOptionsItem.delegate = self 
     cell.configureCell(with: option) 
     return cell 
    } 

    func textFieldDidBeginEditing(_ textField: UITextField) { 
     self.cellSelected = options.index(of: textField.text!)! 
     let indexPath: IndexPath = IndexPath(row: self.cellSelected, section: 0) 
     self.tableView.reloadData() 
     let cell = self.tableView.cellForRow(at: indexPath) as! CellItemOptions 
     cell.nameOptionsItem.becomeFirstResponder() 
    } 

    func textFieldDidEndEditing(_ textField: UITextField) { 
     if textField.text! == "" { 
      if self.options[cellSelected] != "" { 
       db.setRemoveDetailsItem(category: self.categorySelected!, index: cellSelected) 
      } 
      self.options.remove(at: cellSelected) 
     } else { 
      self.options[cellSelected] = "\(textField.text!)" 
      db.setAddDetailsItem(category: self.categorySelected!, index: cellSelected) 
     } 
     db.setCategoryOptions(category: self.categorySelected!, options: self.options, index: cellSelected) 
    } 

    // MARK: - Keyboard 

    func keyboardWillShow(_ notification: NSNotification) { 
     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
      if self.view.frame.size.height == self.viewHeight { 
       self.view.frame.size.height -= keyboardSize.height 
      } 
     } 
    } 

    func keyboardWillHide(_ notification: NSNotification) { 
     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
      if self.view.frame.origin.y != self.viewHeight { 
       self.view.frame.size.height += keyboardSize.height 
      } 
     } 
    } 
} 

class CellItemOptions: UITableViewCell { 
    static let identifier = "OptionsItemCell" 

    @IBOutlet weak var nameOptionsItem: UITextField! 

    private let tableView = OptionsItemViewController() 

    func configureCell(with cell: String) { 
     nameOptionsItem.text = cell 
    } 
} 

的问题,与此代码,是内存使用,可适当增加,而且CPU在100%左右使用!我认为我创造了无限的指令,但是我没有找到它......

谢谢!

所以首先,#3绝对是你想要的。 #1和#2都只是被表视图调用来实际设置单元格。你不应该直接打电话给他们。 #3向tableview查询一个已经存在的单元格(如果该索引路径是可见的),这就是你想要的。

#3的代码看起来没问题,所以问题可能在其他地方,你可以发布剩余的代码,当你重新加载时被调用吗?