简体   繁体   English

IOS双击UITableView中的单元格原因项目不会滚动

[英]IOS Double click on cell cause item in UITableView won't scroll

I have a UITableView that contains UITextField in each cell 我有一个UITableView ,在每个单元格中包含UITextField
When I click UITextField in the cell, the keyboard will show and cover my cell. 当我单击单元格中的UITextField时,键盘将显示并覆盖我的单元格。 Therefore, I move my cell to the top by using. 因此,我通过使用将我的细胞移到顶部。

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    CGPoint scrollPoint = CGPointMake(0, self.activeInputView.frame.origin.y);
    [self.tableView setContentOffset:scrollPoint animated:YES];
}

If I use single click on each cell, my application work fine. 如果我单击每个单元格,我的应用程序工作正常。
However, I use double click on each cell (it mean I tap on it 2 times very quickly), my cell will stop scroll to the top. 但是,我使用双击每个单元格(这意味着我很快点击它2次),我的单元格将停止滚动到顶部。

In this line 在这一行

CGPoint scrollPoint = CGPointMake(0, self.activeInputView.frame.origin.y);

can be 2 errors. 可能是2个错误。

Firstly, you have to make sure that inputView that you have captured is the view you want. 首先,您必须确保捕获的inputView是您想要的视图。 Secondly, you should convert fetched point to correct view using appropriate method. 其次,您应该使用适当的方法将获取的点转换为正确的视图。

See reference: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/doc/uid/TP40006816-CH3-SW52 参见参考: https//developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/doc/uid/TP40006816-CH3-SW52

For further investigation need more context. 进一步调查需要更多背景。

TPKeyboardAvoiding似乎是一个解决方案。

Are you sure that the scrollPoint is correct? 你确定scrollPoint是正确的吗?

I just created a sample project with a fixed offset and everything works perfectly fine. 我刚刚创建了一个带有固定偏移的示例项目,一切都运行得很好。 The table view scrolls upwards after single and double tap on the UITextField of a certain UITableViewCell . 在单个和双击某个UITableViewCellUITextField后,表视图向上滚动。

- (void)keyboardDidShow:(NSNotification *)notification {
    CGPoint point = CGPointMake(0.0, 30.0);
    [self.tableView setContentOffset:point animated:YES];
}

而不是做代码手动调整你的tableview框架,让我给你一个建议,你可以使用其codapods中可用的pod的IQKeyboardManager,它将管理当单击单元格的文本字段时,tableview将自动滚动。

Try to use third party library IQKeyboardManager it will help you to solve this issue. 尝试使用第三方库IQKeyboardManager它将帮助您解决此问题。

https://github.com/hackiftekhar/IQKeyboardManager https://github.com/hackiftekhar/IQKeyboardManager

Replace following code in your AppDelegate.m file and then you don't need to use scrollview method to handle keyboard :- 替换AppDelegate.m文件中的以下代码,然后您不需要使用scrollview方法来处理键盘: -

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[IQKeyboardManager sharedManager] setEnable:YES];

    [self.window makeKeyAndVisible];
    return YES;

}

Have you created separate UITableViewCell class ? 你有没有创建单独的UITableViewCell类?

I believe as you scroll your UITableView your UI freezes or when you tab twice frequently your UITableView stops responding or taking time to respond. 我相信当您滚动UITableView时,您的UI会冻结,或者当您经常两次选项卡时,您的UITableView会停止响应或花时间做出响应。

Here is a working example. 这是一个有效的例子。 You use your scroll view's contentInset and scrollIndicatorInsets properties to avoid the keyboard when it appears. 您可以使用滚动视图的contentInsetscrollIndicatorInsets属性来避免键盘出现时。 You should register for keyboard notifications. 您应该注册键盘通知。 Use the info in the notifications to determine the size of the keyboard--you never know what that will be. 使用通知中的信息来确定键盘的大小 - 你永远不知道它会是什么。

Using content inset is the correct way to handle this for scroll views. 使用内容插入是处理滚动视图的正确方法。 If you subsequently need to scroll your editing row into view, use UITableView.scrollToRowAtIndexPath(_:, atScrollPosition:, animated:) 如果您随后需要将编辑行滚动到视图中,请使用UITableView.scrollToRowAtIndexPath(_:,atScrollPosition:,animated :)

Notice that the does the right thing when the user hides/shows the completions bar. 请注意,当用户隐藏/显示完成栏时,它会做正确的事情。

import UIKit
import CoreGraphics

// our Cell class
class Cell : UITableViewCell
{
    // cell reuse identifier for table view
    static let Identifier = "Cell" 

    // the object the cell represents/displays. Could be anything you like
    var value:AnyObject? {
        didSet {
            // update our text field when our cell value is set.
            self.textField.text = value as? String
        }
    }

    // use a text field to display our contents, since that allows editing and showing the keyboard
    lazy var textField:UITextField = {
        let textField = UITextField()
        self.contentView.addSubview( textField )
        return textField
    }()

    override func layoutSubviews() {
        super.layoutSubviews()
        self.textField.frame = contentView.bounds.insetBy(dx: 20, dy: 4 )
    }
}

// table view data source class
class DataSource : NSObject, UITableViewDataSource
{
    var numberOfRows:Int { return items.count }
    let items = [ "Seoul", "São Paulo", "Bombay", "Jakarta", "Karachi", "Moskva", "Istanbul", "Mexico", "Shanghai", "Tokyo", "New" York, "Bangkok", "Beijing", "Delhi", "London", "Hong Kong", "Cairo", "Tehran", "Bogota", "Bandung", "Tianjin", "Lima", "Rio de Janeiro", "Lahore", "Bogor", "Santiago", "St Petersburg", "Shenyang", "Calcutta", "Wuhan" ]

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return numberOfRows
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCellWithIdentifier( Cell.Identifier ) as? Cell ?? Cell()
        cell.value = items[ indexPath.row ]
        return cell
    }
}

class ViewController : UIViewController
{
    override func viewDidLoad() {
        super.viewDidLoad()
        // register for notifications when the keyboard appears:
        NSNotificationCenter.defaultCenter().addObserver( self, selector: "keyboardWillShow:", name: UIKeyboardWillChangeFrameNotification, object: nil)
    }
    override func viewDidLayoutSubviews() {
        tableView.frame = view.bounds
    }

    lazy var tableView:UITableView = {
        let tableView = UITableView()
        self.view.addSubview( tableView )
        tableView.dataSource = self.dataSource
        tableView.delegate = self
        return tableView
    }()

    lazy var dataSource : DataSource = DataSource()

    // Handle keyboard frame changes here. 
    // Use the CGRect stored in the notification to determine what part of the screen the keyboard will cover.
    // Adjust our table view's contentInset and scrollIndicatorInsets properties so that the table view content avoids the part of the screen covered by the keyboard
    @objc func keyboardWillShow( note:NSNotification )
    {
        // read the CGRect from the notification (if any)
        if let newFrame = (note.userInfo?[ UIKeyboardFrameEndUserInfoKey ] as? NSValue)?.CGRectValue() {
            let insets = UIEdgeInsetsMake( 0, 0, newFrame.height, 0 )
            tableView.contentInset = insets
            tableView.scrollIndicatorInsets = insets
        }
    }
}

// need to conform to UITableViewDelegate protocol since we are the table view's delegate
extension ViewController : UITableViewDelegate
{
}

// App set up stuff here:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    lazy var window:UIWindow? = UIWindow()


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        window!.rootViewController = ViewController()
        window!.makeKeyAndVisible()
        return true
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM