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):
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.
Danke, ging mit IQKeyboardManager am Ende - hatte nicht gedacht, nach einer Bibliothek zu suchen – SimonBarker
UPDATE zu obigem Kommentar: IQKeyboardManager funktionierte nicht ganz richtig so versuchte TPKeyboardAvoiding und es funktionierte perfekt – SimonBarker
Froh, dass es für Sie arbeitete. Was hat mit dem IQKeyboardManager nicht funktioniert? Gab es einen Fehler oder fehlte ein Feature? – oyalhi