2017-08-16 89 views
0

我有一個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%左右使用!我認爲我創造了無限的指令,但是我沒有找到它......

謝謝!

回答

0

所以首先,#3絕對是你想要的。 #1和#2都只是被表視圖調用來實際設置單元格。你不應該直接打電話給他們。 #3向tableview查詢一個已經存在的單元格(如果該索引路徑是可見的),這就是你想要的。

#3的代碼看起來沒問題,所以問題可能在其他地方,你可以發佈剩餘的代碼,當你重新加載時被調用嗎?