Ios Swift-重新加载数据不起作用
所以我一直在研究其他人们有这个问题的问题,但我似乎找不到解决我问题的方法 我想使用一个按钮刷新并将新数据重新加载到我的tableview中,并使用同一个按钮检索数据:Ios Swift-重新加载数据不起作用,ios,uitableview,swift,reloaddata,custom-cell,Ios,Uitableview,Swift,Reloaddata,Custom Cell,所以我一直在研究其他人们有这个问题的问题,但我似乎找不到解决我问题的方法 我想使用一个按钮刷新并将新数据重新加载到我的tableview中,并使用同一个按钮检索数据: @IBOutlet var tv: UITableView! @IBAction func refreshTapped(sender: AnyObject) { var query = PFQuery(className:"textMessage") query.whereKey("Receiver", equal
@IBOutlet var tv: UITableView!
@IBAction func refreshTapped(sender: AnyObject) {
var query = PFQuery(className:"textMessage")
query.whereKey("Receiver", equalTo:PFUser.currentUser().username)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]!, error: NSError!) -> Void in
if error == nil {
NSLog("Successfully retrieved \(objects.count) scores.")
var image = UIImage()
for object in objects{
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let contxt: NSManagedObjectContext = appDel.managedObjectContext!
let ene = NSEntityDescription.entityForName("MessageInformation", inManagedObjectContext: contxt)
var newMessage = Messages(entity: ene!, insertIntoManagedObjectContext: contxt)
let type = object["MessageType"] as Int
switch type{
case 0:
let message: String = object["Message"] as String
let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).txt"
message.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: nil)
println(path)
newMessage.sender = object["Receiver"] as String
case 1:
let userImageFile = object["Image"] as PFFile
userImageFile.getDataInBackgroundWithBlock {
(imageData: NSData!, error: NSError!) -> Void in
if error == nil {
image = UIImage(data:imageData)
let imageToSave:NSData = UIImagePNGRepresentation(image)
let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).png"
imageToSave.writeToFile(path, atomically: true)
println(path)
}
}
newMessage.sender = object["Receiver"] as String
case 2:
let message: String = object["Message"] as String
let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).txt"
message.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: nil)
println(path)
newMessage.sender = object["Receiver"] as String
case 3:
let userImageFile = object["Image"] as PFFile
userImageFile.getDataInBackgroundWithBlock {
(imageData: NSData!, error: NSError!) -> Void in
if error == nil {
image = UIImage(data:imageData)
let imageToSave:NSData = UIImagePNGRepresentation(image)
let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).png"
imageToSave.writeToFile(path, atomically: true)
println(path)
}
}
newMessage.sender = object["Receiver"] as String
default:
println("Type not found")
}
}
}else {
// Log details of the failure
NSLog("Error: %@ %@", error, error.userInfo!)
}
}
self.tv.reloadData()
}
这根本不起作用,我也很确定我的引用是好的。下面是我的viewDidLoad函数,如果有帮助的话:
override func viewDidLoad() {
super.viewDidLoad()
var nib = UINib(nibName: "TableViewCell", bundle: nil)
tv.registerNib(nib, forCellReuseIdentifier: "cell")
let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let context:NSManagedObjectContext = appDel.managedObjectContext!
let fetchReq = NSFetchRequest(entityName: "MessageInformation")
let en = NSEntityDescription.entityForName("MessageInformation", inManagedObjectContext: context)
let sortDescriptor = NSSortDescriptor(key: "dateReceived", ascending: false)
fetchReq.sortDescriptors = [sortDescriptor]
messageList = context.executeFetchRequest(fetchReq, error: nil) as [Messages]
tv.reloadData()
}
我用swift编程已经有一段时间了,但仍然没有正确使用这个功能
如有任何关于如何进行的建议,将不胜感激
编辑:My cellForRowAtIndexPath函数:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let longPress: UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: "cellLongPressed:")
longPress.delegate = self
longPress.minimumPressDuration = 0.5
longPress.numberOfTouchesRequired = 1
let cell:TableViewCell = self.tv.dequeueReusableCellWithIdentifier("cell") as TableViewCell
cell.addGestureRecognizer(longPress)
let data = messageList[indexPath.row] as Messages
cell.labelOutl.text = data.sender
return cell
}
您的
self.tv.reloadData()
在闭包之外,因此当数据检索将异步进行时,您将在检索数据之前立即调用reloadData
应该是-
@IBOutlet var tv: UITableView!
@IBAction func refreshTapped(sender: AnyObject) {
var query = PFQuery(className:"textMessage")
query.whereKey("Receiver", equalTo:PFUser.currentUser().username)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]!, error: NSError!) -> Void in
if error == nil {
NSLog("Successfully retrieved \(objects.count) scores.")
var image = UIImage()
for object in objects{
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let contxt: NSManagedObjectContext = appDel.managedObjectContext!
let ene = NSEntityDescription.entityForName("MessageInformation", inManagedObjectContext: contxt)
var newMessage = Messages(entity: ene!, insertIntoManagedObjectContext: contxt)
let type = object["MessageType"] as Int
switch type{
case 0:
let message: String = object["Message"] as String
let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).txt"
message.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: nil)
println(path)
newMessage.sender = object["Receiver"] as String
case 1:
let userImageFile = object["Image"] as PFFile
userImageFile.getDataInBackgroundWithBlock {
(imageData: NSData!, error: NSError!) -> Void in
if error == nil {
image = UIImage(data:imageData)
let imageToSave:NSData = UIImagePNGRepresentation(image)
let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).png"
imageToSave.writeToFile(path, atomically: true)
println(path)
}
}
newMessage.sender = object["Receiver"] as String
case 2:
let message: String = object["Message"] as String
let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).txt"
message.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: nil)
println(path)
newMessage.sender = object["Receiver"] as String
case 3:
let userImageFile = object["Image"] as PFFile
userImageFile.getDataInBackgroundWithBlock {
(imageData: NSData!, error: NSError!) -> Void in
if error == nil {
image = UIImage(data:imageData)
let imageToSave:NSData = UIImagePNGRepresentation(image)
let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).png"
imageToSave.writeToFile(path, atomically: true)
println(path)
}
}
newMessage.sender = object["Receiver"] as String
default:
println("Type not found")
}
}
dispatch_async(dispatch_get_main_queue(),{ ()->() in
self.tv.reloadData()
})
}else {
// Log details of the failure
NSLog("Error: %@ %@", error, error.userInfo!)
}
}
}
但是您还有另一个问题-您实际上没有使用
newMessage
变量来更新数据模型您在主线程上重新加载数据,但在后台异步更新数据。。。哪个数组是表的数据源?好吧,我在每种情况下都添加了“contxt.save(nil)”,以便更新我的数据模型,我还更改了重新加载数据的位置,但按下按钮时仍然没有任何变化。但是,如果我重新启动应用程序,则会填充tableview。您如何将核心数据中的数据获取到tableview中?您正在使用fetchedResultsController吗?听起来好像您没有将CoreData中的数据重新加载到您在CellForRowatineXpath
中使用的任何源中。我现在添加了CellForRowatineXpath函数,我没有使用fetchedResultsController。好的,因此,您需要使用新数据和核心数据更新messageList
数组。您不应该直接调用viewDidLoad
。您应该删除从viewDidLoad
加载数据的代码,并将其放入自己的方法中。然后可以从viewDidLoad
和刷新函数调用此方法