为什么我的 UITableView 'Tap to Edit' 功能很慢?

Why is my UITableView 'Tap to Edit' Function SLOW?

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

  1. 点击后,代码将单元格的 title/desc 保存到 vars
  2. 然后启动我的模态编辑器视图
  3. main VC passed editor VC title/desc vars
  4. 变量值加载到文本框中,以便用户可以编辑它们

问题:

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

代码加载到 main 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
    }
}

已修复!

在收到一些评论并研究了这些建议后,我已经解决了这个问题,即我的手机点击在第一次点击时没有快速切换(但双击得到快速响应!)。

一个评论说我应该在后台调用CoreData,如果可行,那么我读到的很多观点都是错误的。我读了很多说后台线程可能实际上导致了这个问题。不过我没试过,所以我不能确定它是对还是错。

相反,@pdasdf 的评论让我走上了正确的道路。 如果您要创建一个 table 在点击单元格时继续显示的内容,那么您可能会在如下代码中这样做:

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 函数内但在 dispatch 函数之外进行:

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

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

祝你好运。