为啥我的 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 中显示为空白?
为啥我的 plist 不会填充我的 UITableView?