为啥我的 UITableView 的“点击编辑”功能很慢?

Posted

技术标签:

【中文标题】为啥我的 UITableView 的“点击编辑”功能很慢?【英文标题】:Why is my UITableView 'Tap to Edit' Function SLOW?为什么我的 UITableView 的“点击编辑”功能很慢? 【发布时间】:2015-08-10 01:46:08 【问题描述】:

我有一个 UITableView 列表。我添加了代码,因此当点击列表项/行时,用户可以在模式视图中编辑单元格内容:

    点击后,代码会将单元格的标题/描述保存到 vars 然后启动我的模态编辑器视图 主 VC 向编辑器 VC 传递标题/描述变量 var 值被加载到文本框中,以便用户进行编辑

问题:

这是一种奇怪的行为。当我测试应用程序时,第一次在打开应用程序后点击一个单元格时,有时会延迟 2-3 秒,然后才会出现模态视图。我还注意到延迟发生在我第一次点击每个单元格时,但不是第二次。最后,有时在打开应用程序后,它似乎忽略了第一次点击。这是正常的核心数据获取请求行为吗?

在主 VC ViewDidLoad 上加载的代码

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    //Break

    //Load the list from Core Data
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext!
    let fetchRequest = NSFetchRequest(entityName:"TodayTask")
    var error: NSError?
    let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as? [NSManagedObject]

    if let results = fetchedResults 
        todayTaskList = results
     else 
        println("Could not fetch \(error), \(error!.userInfo)")
    

    //Break

    //This provides a variable height for each row
    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 80.0

    //Break

    //Part of code for cell drag and drop functionality
    let longpress = UILongPressGestureRecognizer(target: self, action: "longPressGestureRecognized:")
    tableView.addGestureRecognizer(longpress)

在单元格点击时运行代码

//Action: Performs 'tap on edit' segue
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    passingEdit = true
    performSegueWithIdentifier("modalToEditor", sender: nil)


//Prepares variables to be passed for editing
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if (segue.identifier == "modalToEditor") && passingEdit == true 

        //Assign selection to a variable 'currentCell'
        let indexPath = tableView.indexPathForSelectedRow();
        let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as! CustomTableViewCell;

        //Set cell text into variables to pass to editor
        var cellNameForEdit = currentCell.nameLabel!.text
        var cellDescForEdit = currentCell.descLabel.text

        //Pass values to EditorView
        var editorVC = segue.destinationViewController as! EditorView;
        editorVC.namePassed = cellNameForEdit
        editorVC.descPassed = cellDescForEdit
        editorVC.indexOfTap = indexPath
    

【问题讨论】:

你应该在'BackGround'线程上调用CoreData 你在 ios8 上吗?我认为这是一个错误。有关解决方法,请参阅this answer。下面评论中的链接也很有趣。 @pbasdf 我正在使用 8.4 - 我会尝试解决这个问题。非常感谢 【参考方案1】:

已修复!

在收到一些 cmets 并研究了建议后,我已经能够解决我的单元格在第一次点击时没有快速连续的问题(但双击会得到快速响应!)。

一个评论是我应该在后台调用CoreData,如果这样有效,那么我读到的很多意见都是错误的。我读了很多说后台线程实际上可能是导致问题的原因。不过我没有尝试过,所以我无法确认它是对还是错。

相反,@pdasdf 的评论让我走上了正确的道路。如果您要创建一个在点击单元格时进行分隔的表格,您可能会在如下代码中执行此操作这个:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

    performSegueWithIdentifier("modalToEditor", sender: nil)


这就是我的代码的样子。我还有其他一些事情可以告诉我的 prepareForSegue 正在编码什么,但以上是重要的部分。我所做的只是从那个改变到这个:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

    dispatch_async(dispatch_get_main_queue())  () -> Void in
        self.performSegueWithIdentifier("modalToAllocEditor", sender: nil)
    

我以前从未使用过 dispatch。然而,根据我的阅读,cell-tap-segues 被延迟后存在某种排队问题......所以我认为这正在解决具体的队列问题。

旁注:

如果以上解决了您的所有问题,请停止阅读!这可能与每个人都无关。

如果您的 didSelectRowAtIndexPath 和我的一样,那么实际上您的代码比上面的要多一点。我有一个变量调用“passingEdit”,当点击一个单元格时它会更新,它会告诉我的 prepareForSegue 是否需要传递数据。

在新方法中,如果我在 dispatch 括号内设置这个变量,它就不会运行。因此,如果您需要做其他事情,请确保在 tableView 函数内但在调度函数之外进行:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

    dispatch_async(dispatch_get_main_queue())  () -> Void in
        self.performSegueWithIdentifier("modalToAllocEditor", sender: nil)
    
    passingEdit = true

祝你好运。

【讨论】:

以上是关于为啥我的 UITableView 的“点击编辑”功能很慢?的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中使用插入行

为啥我的 UITableView 不显示数据?

为啥我的单元格在我的 UITableView 中显示为空白?

为啥我的 plist 不会填充我的 UITableView?

为啥我的 UITableView 不执行 show segue,只显示模态

为啥我的子类 UItableView 不滚动?