当直接从textField移动到textField时,UITableView不会移位

时间:2016-04-22 12:00:16

标签: ios swift uitableview uitextfield uikeyboard

我目前正在使用键盘来解决基于Swift的iPhone应用上的一些textField问题。

此图显示了主要问题(前三个图像显示问题,后三个图像显示了该问题):

Issue with tableview shifting correctly

当编辑tableViewCell中的textField时,我想要移动整个tableview和导航栏。我可以使用下面的代码(从viewController获取的代码片段)来执行此操作:

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

...

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

直接移动到tableView中的textField时,它可以正常工作。但是,当我已经在tableView之外编辑textField时,升档不会发生,因此转换切换不同步。

我打印了tableView框架原点:

 public OnKeyBoardHide()
{
edtName.setFocusable(false);
        edtDOB.setFocusable(false);
        edtNationality.setFocusable(false);
        edtPassportNo.setFocusable(false);
        edtIDNo.setFocusable(false);
        edtMobileNo.setFocusable(false);
}

所以我可以看到tableView设置为什么,并且第一次从tableView外的textField移动到tableView内的textField,这个属性是我期望的134,但是它仍然是384它在下次打电话时打印的屏幕上。

在tableView中的单元格内移动时,问题不会发生。

感觉我遇到了某种竞争条件问题,或者我错过了一些被调用的委托方法,这种方法在从一个单元格转换到另一个单元格时会丢掉所有内容。

帮助会很棒。

2 个答案:

答案 0 :(得分:1)

当您使用autolayout 无法直接调整框架时,您必须使用约束(您可以为IB中创建的约束创建IBOutlets或添加新的约束,然后从动画块中将layoutIfNeeded发送到您的视图)。

您可以按照官方Apple说明操作:

答案 1 :(得分:1)

查看此库:https://github.com/michaeltyson/TPKeyboardAvoiding。 旨在使键盘远离文本字段。