直接从 textField 移动到 textField 时 UITableView 不会移动

Posted

技术标签:

【中文标题】直接从 textField 移动到 textField 时 UITableView 不会移动【英文标题】:UITableView doesn't shift when moving from textField to textField directly 【发布时间】:2016-04-22 12:00:16 【问题描述】:

我目前正在处理我的基于 Swift 的 iPhone 应用程序上的一些 textField 问题。

这张图片显示了主要问题(前三张图片显示了问题,后三张是它应该做的):

编辑 tableViewCell 中的 textField 时,我想向上移动整个 tableview 和导航栏。我可以使用下面的代码(取自 viewController 的 sn-ps)来做到这一点:

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 外部的 textField 移动到 tableView 内部的 textField 时,这个属性是我期望的 134,但它在屏幕上仍然是 384它会在下次调用时打印。

在tableView的单元格内移动时不会出现问题。

感觉就像我遇到了某种竞争条件问题,或者我错过了一些被调用的委托方法,当从一个单元格转换到下一个单元格时,它会抛出所有问题。

帮助会很大。

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢,最后选择了 IQKeyboardManager - 没想到要找图书馆 对上述评论的更新:IQKeyboardManager 工作不正常,因此尝试了 TPKeyboardAvoiding 并且效果很好 很高兴它对你有用。 IQKeyboardManager 有什么问题?是否存在错误或缺少功能? 它只是将表格视图向上移动到足以使文本框的高度可见。作为测试,我使表格视图非常短,然后它使单元格滚动得太远,因此,在您看到正在编辑的单元格之前,您必须向后滚动以重新找到该单元格,高度均为 12 像素。【参考方案2】:

当你使用自动布局时你不能像你一样直接调整框架的大小,你必须使用约束(你可以为在 IB 中创建的约束创建 IBOutlets 或添加新的约束,然后从动画块中将 layoutIfNeeded 发送到您的视图)。

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

About Auto Layout and Layout Constraints Animating Layer Content

【讨论】:

以上是关于直接从 textField 移动到 textField 时 UITableView 不会移动的主要内容,如果未能解决你的问题,请参考以下文章

材质 UI - 概述的 TextField 不呈现轮廓

没有调用 textField 代表

当initialValues通过\绑定到props.object时,如何使用Formik表单将焦点设置在TextField\input上?

将文本从Textfield传递到另一个ViewController

如何从嵌入在UIScrollView内部的UiView内嵌的CollectionView接收触摸事件

过滤列表项后,ListView 中的 SwiftUI TextField 变为空白