为什么我的 UITableView 'Tap to Edit' 功能很慢?
Why is my UITableView 'Tap to Edit' Function SLOW?
我有一个 UITableView 列表。我添加了代码,因此当点击 list-item/row 时,用户可以在模态视图中编辑单元格内容:
- 点击后,代码将单元格的 title/desc 保存到 vars
- 然后启动我的模态编辑器视图
- main VC passed editor VC title/desc vars
- 变量值加载到文本框中,以便用户可以编辑它们
问题:
这是一种奇怪的行为。当我测试该应用程序时,第一次 我在打开该应用程序后点击一个单元格时,有时会在模态视图出现之前延迟 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
}
祝你好运。
我有一个 UITableView 列表。我添加了代码,因此当点击 list-item/row 时,用户可以在模态视图中编辑单元格内容:
- 点击后,代码将单元格的 title/desc 保存到 vars
- 然后启动我的模态编辑器视图
- main VC passed editor VC title/desc vars
- 变量值加载到文本框中,以便用户可以编辑它们
问题:
这是一种奇怪的行为。当我测试该应用程序时,第一次 我在打开该应用程序后点击一个单元格时,有时会在模态视图出现之前延迟 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
}
祝你好运。