2016-04-22 5 views
0

Ich kämpfe gerade mit der Tastatur, die ein TextField-Problem in meiner Swift-basierten iPhone-App behandelt.UITableView verschiebt sich nicht, wenn Sie von textField in textField direkt wechseln

Dieses Bild zeigt das primäre Problem (Top drei Bilder zeigen das Problem, sind unten drei, was es tun soll):

Issue with tableview shifting correctly

Wenn das Textfeld in der tableViewCell bearbeitet ich das verschoben werden soll ganze Tabellenansicht und Navigationsleiste oben. Ich kann das (von dem Viewcontroller genommen Snippets) unten mit dem Code tun:

var tableViewShiftedUp = false 

...

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! QuantityTableViewCell 

     let componentLocationQuantity = tableViewData[indexPath.row] 

     if let locationString = componentLocationQuantity.location.valueForKey("location_name") as? String { 
      cell.setCellContents(locationString, quantity: componentLocationQuantity.quantity.floatValue) 
      cell.quantityLabel.delegate = self 
     } 

     //get stock level related to current build rate and lead time (good - green, warning - orange, urgent - red) 
     let status = model.determineStockLevelStatus(component) 
     cell.setQuantityLabelBackgroundStatusColor(status) 

     if editingMode == true { 
      cell.makeQuantityEditable() 
     } 

     //add control event to detect text change 
     cell.quantityLabel.addTarget(self, action: #selector(quantityCellTextChanged(_:)), forControlEvents: UIControlEvents.EditingChanged) 
     cell.quantityLabel.addTarget(self, action: #selector(quantityCellSelected(_:)), forControlEvents: UIControlEvents.EditingDidBegin) 


     return cell 
    } 

...

//MARK: - UITextfield delegate 
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     self.view.endEditing(true) 

     if tableViewShiftedUp == true { 
      moveTable() 
     } 

    } 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     return true 
    } 

    func quantityCellSelected(textField: UITextField){ 
     if tableViewShiftedUp == false { 
      moveTable() 
     } 
     //check table was moved 
     print(tableView.frame.origin.y) 
    } 

    func hideKeyboard(){ 
     self.view.endEditing(true) 
     if tableViewShiftedUp == true { 
      moveTable() 
     } 
    } 

    func moveTable(){ 
     if tableViewShiftedUp == true { 
      animateTableViewMoving(false, moveValue: 250) 
      animateNavigationBarMoving(false, moveValue: 250) 
      tableViewShiftedUp = false 
     } else { 
      animateTableViewMoving(true, moveValue: 250) 
      animateNavigationBarMoving(true, moveValue: 250) 
      tableViewShiftedUp = true 
     } 
    } 

    // moving the tableView 
    func animateTableViewMoving (up:Bool, moveValue :CGFloat){ 
     let movementDuration:NSTimeInterval = 0.0 
     let movement:CGFloat = (up ? -moveValue : moveValue) 
     UIView.beginAnimations("animateView", context: nil) 
     UIView.setAnimationBeginsFromCurrentState(true) 
     UIView.setAnimationDuration(movementDuration) 
     self.tableView.frame = CGRectOffset(self.tableView.frame, 0, movement) 
     UIView.commitAnimations() 
    } 
    // moving the navigationBar 
    func animateNavigationBarMoving (up:Bool, moveValue :CGFloat){ 
     let movementDuration:NSTimeInterval = 0.0 
     let movement:CGFloat = (up ? -moveValue : moveValue) 
     UIView.beginAnimations("animateView", context: nil) 
     UIView.setAnimationBeginsFromCurrentState(true) 
     UIView.setAnimationDuration(movementDuration) 
     self.midNavigationBar.frame = CGRectOffset(self.midNavigationBar.frame, 0, movement) 
     UIView.commitAnimations() 
    } 

Und es funktioniert gut bei Bewegung direkt zum TextField in der TableView. Wenn ich jedoch ein TextField außerhalb der TableView bearbeite, tritt die Hochschaltung nicht auf und der Shift-Toggle wird nicht mehr synchronisiert.

Ich habe den Tableview Rahmen Herkunft gedruckt:

//check table was moved 
print(tableView.frame.origin.y) 

so kann ich sehen, was die Tableview ist auf und an diesem ersten Schritt von Textfield außerhalb des Tableview innerhalb des Tableview TextField-, ist diese Eigenschaft, was Ich würde erwarten, dass es 134 ist, aber es ist immer noch bei 384 auf dem Bildschirm, die es beim nächsten Aufruf druckt.

Das Problem tritt nicht auf, wenn innerhalb von Zellen in der TableView verschoben wird.

Es fühlt sich an, als hätte ich irgendeine Art von Race-Condition-Problem oder ich vermisse eine Delegate-Methode, die aufgerufen wird, die beim Übergang von einer Zelle zur nächsten alles wegwirft.

Hilfe wäre toll.

Antwort

1

prüfen diese Bibliothek aus: https://github.com/michaeltyson/TPKeyboardAvoiding. Entwickelt, damit die Tastatur Textfeldern nicht in die Quere kommt.

+0

Danke, ging mit IQKeyboardManager am Ende - hatte nicht gedacht, nach einer Bibliothek zu suchen – SimonBarker

+0

UPDATE zu obigem Kommentar: IQKeyboardManager funktionierte nicht ganz richtig so versuchte TPKeyboardAvoiding und es funktionierte perfekt – SimonBarker

+0

Froh, dass es für Sie arbeitete. Was hat mit dem IQKeyboardManager nicht funktioniert? Gab es einen Fehler oder fehlte ein Feature? – oyalhi

1

Wenn Sie automatisches Layout verwenden, können Sie nicht Rahmen direkt die Größe wie Sie tun, müssen Sie mit Einschränkungen arbeiten (Sie IBOutlets für Einschränkungen erstellt in IB erstellen oder neue hinzufügen, dann layoutIfNeeded von innen her ein zu Ihrer Ansicht senden Animationsblock).

können Sie offizielle Apple-Anweisungen folgen: