2016-04-22 69 views
0

我目前正在與基於Swift的iPhone應用程序覆蓋一些textField問題的鍵盤作戰。當從textField直接移動到textField時,UITableView不會移位

此圖像顯示的首要問題(前三名圖像顯示的問題,底部的三個是什麼應該做的):

Issue with tableview shifting correctly

當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中的單元格內移動時,不會發生此問題。

感覺就像我遇到了某種競爭條件問題,或者我錯過了一些委託方法被稱爲從一個單元格過渡到下一個單元格時拋棄所有東西。

幫助會很好。

回答

1

看看這個庫:https://github.com/michaeltyson/TPKeyboardAvoiding。 旨在讓鍵盤擺脫文本字段的方式。

+0

謝謝,最終跟IQKeyboardManager一起去了 - 沒有想過要去找圖書館 – SimonBarker

+0

更新到以上評論:IQKeyboardManager工作不正常,所以嘗試了TPKeyboardAvoiding,它工作完美 – SimonBarker

+0

很高興爲你效勞。什麼不與IQKeyboardManager一起使用?有沒有缺陷,或缺乏功能? – oyalhi

1

當您使用自動佈局你不能調整框架直接像你這樣做,你必須用約束工作(您可以創建在IB創建的約束IBOutlets或添加新的,然後從內發送layoutIfNeeded你的看法動畫塊)。

你可以按照蘋果官方的說明:

相關問題