我创建了一个应用程序,用于在Core Data中存储一些播放列表。我使用表视图控制器来显示播放列表。用户还可以在表格视图中添加和删除播放列表。
删除按钮正常工作。我在导航栏的右侧添加了一个添加按钮。按下按钮时,会显示警告并询问用户是否有播放列表的名称。如果用户未输入任何内容,则另一个警报将显示错误。如果用户输入有效,则播放列表将添加到表格视图中。
以下是相关代码:
import UIKit
import CoreData
class PlaylistController: UITableViewController {
var playlists: [Playlists] = []
let dataContext: NSManagedObjectContext! = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext
override func viewDidLoad() {
if dataContext != nil {
let entity = NSEntityDescription.entityForName("Playlist", inManagedObjectContext: dataContext)
let request = NSFetchRequest()
request.entity = entity
let playlists = try? dataContext.executeFetchRequest(request)
if playlists != nil {
for item in playlists! {
self.playlists.append(item as! Playlists)
}
}
}
}
//This will be called when the user clicks the add button
@IBAction func addPlaylist(sender: UIBarButtonItem) {
let alert = UIAlertController(title: "新播放列表", message: "请输入播放列表的名字", preferredStyle: .Alert)
alert.addTextFieldWithConfigurationHandler({ (textField) -> Void in
textField.placeholder = "名字"
})
alert.addAction(UIAlertAction(title: "确定", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
if alert.textFields?.first?.text == "" || alert.textFields?.first?.text == nil {
let failAlert = UIAlertController(title: "失败", message: "播放列表名不能为空", preferredStyle: .Alert)
failAlert.addAction(UIAlertAction(title: "确定", style: .Default, handler: nil))
self.presentViewController(failAlert, animated: true, completion: nil)
return
}
let newPlaylist = Playlists(entity: NSEntityDescription.entityForName("Playlist", inManagedObjectContext: self.dataContext)!, insertIntoManagedObjectContext: self.dataContext)
newPlaylist.name = alert.textFields?.first?.text
self.playlists.append(newPlaylist)
do {
try self.dataContext.save()
} catch let error as NSError {
print(error)
}
self.tableView.reloadData()
}))
alert.addAction(UIAlertAction(title: "取消", style: UIAlertActionStyle.Cancel, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
}
}
当我点击添加按钮并给播放列表命名,然后单击确定(确定)时,我需要等待大约0.5~1秒才能看到新单元格显示。
造成这种情况的原因是什么?我的第一个猜测是警报的创建花了太长时间。但实际上警报很快就出现了!我认为必须与reloadData
方法有关。但到底是什么?这是表格视图的正常行为吗?
答案 0 :(得分:0)
也许完全重新加载tableview需要很长时间(假设数据似乎来自NSManagedObjects)。
您是否尝试使用insertRowsAtIndexPaths而不是self.tableView.reloadData()?
由于您已经将记录添加到数组中,并且您知道它应该出现在哪一行,因此无需重新加载整个tableview。
答案 1 :(得分:-1)
看起来你没有使用NSFetchedResultController。我想你的桌面数据基于播放列表。也许您可以先尝试更新表视图,然后再保存核心数据。
self.playlists.append(newPlaylist)
self.tableView.reloadData()
self.dataContext.performBlock({ () -> Void in
do {
try self.dataContext.save()
} catch let error as NSError {
print(error)
}
})