2017-08-16 3 views
0

Ich habe eine Tabelle mit einer Liste von TextField in jeder Zelle und ich benutze die UITextFieldDelegate. Der Benutzer kann schreiben, dass er will und Zeile hinzufügen.Tabellenansicht Zeile nach dem Neuladen von Daten Endlosschleife auswählen

Das Problem ist, dass der Tableview neu geladen werden muss, um das Ergebnis zu dem Benutzer zu zeigen, aber es die becomeFirstResponder brechen() ...

Ich versuche habe diese Lösung nach 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() 

Aber es funktioniert nicht.

Vielen Dank für Ihre Hilfe!

EDIT: mein Code

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 
    } 
} 

Das Problem mit diesem Code ist der Speicher, increse und die CPU um 100% verwendet wird !! Ich denke, dass ich eine unendliche Anweisung erstellt habe, aber ich finde es nicht ...

Danke!

Antwort

0

Also vor allem ist # 3 definitiv die, die Sie wollen. # 1 und # 2 sollen beide nur von der Tabellenansicht aufgerufen werden, um die Zellen tatsächlich einzurichten. Sie sollten sie nicht direkt anrufen. # 3 fragt die Tabellenansicht nach einer bereits existierenden Zelle (wenn dieser Indexpfad sichtbar ist), die Sie hier haben möchten.

Der Code für # 3 sieht für sich allein gut aus, also kann das Problem woanders liegen, können Sie den Rest des Codes posten, der beim erneuten Laden aufgerufen wird?

Verwandte Themen