我目前正在與基於Swift的iPhone應用程序覆蓋一些textField問題的鍵盤作戰。當從textField直接移動到textField時,UITableView不會移位
此圖像顯示的首要問題(前三名圖像顯示的問題,底部的三個是什麼應該做的):
當tableViewCell文本字段編輯我想移動整個tableview和導航欄了。我可以用下面的代碼(片段從拍攝的viewController)做到這一點:
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()
}
,並直接移動時它工作正常到tableView中的textField。但是,當我已經在tableView外部編輯textField時,不會發生移位,因此移位切換不同步。
我打印的tableView框產地:
//check table was moved
print(tableView.frame.origin.y)
這樣我就可以看到什麼的tableView設置並從文本框是第一次移動的tableView外的tableView裏面文本框,這個屬性是什麼我希望它是134,但它仍然在屏幕上,它在下次打印時仍然在384。
在tableView中的單元格內移動時,不會發生此問題。
感覺就像我遇到了某種競爭條件問題,或者我錯過了一些委託方法被稱爲從一個單元格過渡到下一個單元格時拋棄所有東西。
幫助會很好。
謝謝,最終跟IQKeyboardManager一起去了 - 沒有想過要去找圖書館 – SimonBarker
更新到以上評論:IQKeyboardManager工作不正常,所以嘗試了TPKeyboardAvoiding,它工作完美 – SimonBarker
很高興爲你效勞。什麼不與IQKeyboardManager一起使用?有沒有缺陷,或缺乏功能? – oyalhi