table view.reloadData() 在 table 视图中不起作用
table view.reloadData() doesn't work within the table view
table view.reloadData() 在我更改视图控制器并返回后更新 table 视图。我添加了拉动刷新功能:
lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged)
refreshControl.backgroundColor = UIColor.purpleColor()
// dispatch_async(dispatch_get_main_queue(), { () -> Void in
// self.tableView.reloadData()
// })
return refreshControl
}()
这在任何方法之外。然后在viewdidload():
override func viewDidLoad() {
self.tableView.addSubview(self.refreshControl)
}
handleRefresh 函数是这样的:
func handleRefresh(refreshControl: UIRefreshControl) {
// Do some reloading of data and update the table view's data source
// Fetch more objects from a web service, for example...
fetch() // Fetches new data
refreshControl.endRefreshing()
self.tableView.reloadData()
}
这有效,但只有在我退出视图控制器并返回之后。我认为问题在于用于填充 table 视图单元格的数组是一个全局数组,这意味着它是在与导入语句相同的范围内声明的,但我不确定。我想要一些关于如何在 "refresh" 视图被拉动后立即刷新 table 视图的建议。
这是我的获取代码:
func fetch(){
var query = PFQuery(className:"Photo")
query.whereKey("friend", equalTo:"bob")
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
// The find succeeded.
self.getImageData(objects as [PFObject])
if let objects = objects as? [PFObject] {
PhotoInfoArray = objects // This is the global array that stores photo information, date created, etc.
}
} else {
println("Error: \(error!) \(error!.userInfo!)")
}
}
}
func getImageData(objects: [PFObject]) {
for object in objects {
let thumbNail = object["Image"] as PFFile
thumbNail.getDataInBackgroundWithBlock({
(imageData: NSData!, error: NSError!) -> Void in
if (error == nil) {
let image = UIImage(data:imageData)
//image object implementation
imageArray.append(image!)// this is the global array that stores the actual pictures
// println(image)
}
})//getDataInBackgroundWithBlock - end
}//for - end
}
这些函数使用 Parse 作为后端。
tableView 具有重新加载它的内置功能,在第一个视图中将显示前 20 个项目已加载,然后,当您滚动 table 时,另外 20 个项目被加载到 table ,所有的方法都被再次调用。所以不需要使用刷新。
我认为跟踪数组中的实际内容可能是个好主意,因为我从未见过 self.tableView.reloadData() 不起作用的情况。
我建议在 viewWillAppear 或 viewDidAppear 中打印数组。
如果您需要像这样等待其他进程完成,那么添加一个成功调用可能会很方便:
func someFunction(success: ((success: Bool) -> Void))) {
//Perform some tasks here
success(success: true)
}
然后在 viewcontroller 中预期结果如下所示:
someFunction({ (bool) -> Void in
if bool {
self.tableView.reloadData()
}
})
您的获取调用很可能是异步的(在后台完成),因此当您的代码点击 reloadData 时,尚未收到数据。您当前的代码取决于同步执行。
因此,您想在 fetch 调用的回调(或委托方法)中执行 reloadData 调用。也许研究一下最适合这类事情的闭包。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html
也许你可以展示一些你的抓取代码..
table view.reloadData() 在我更改视图控制器并返回后更新 table 视图。我添加了拉动刷新功能:
lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged)
refreshControl.backgroundColor = UIColor.purpleColor()
// dispatch_async(dispatch_get_main_queue(), { () -> Void in
// self.tableView.reloadData()
// })
return refreshControl
}()
这在任何方法之外。然后在viewdidload():
override func viewDidLoad() {
self.tableView.addSubview(self.refreshControl)
}
handleRefresh 函数是这样的:
func handleRefresh(refreshControl: UIRefreshControl) {
// Do some reloading of data and update the table view's data source
// Fetch more objects from a web service, for example...
fetch() // Fetches new data
refreshControl.endRefreshing()
self.tableView.reloadData()
}
这有效,但只有在我退出视图控制器并返回之后。我认为问题在于用于填充 table 视图单元格的数组是一个全局数组,这意味着它是在与导入语句相同的范围内声明的,但我不确定。我想要一些关于如何在 "refresh" 视图被拉动后立即刷新 table 视图的建议。
这是我的获取代码:
func fetch(){
var query = PFQuery(className:"Photo")
query.whereKey("friend", equalTo:"bob")
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
// The find succeeded.
self.getImageData(objects as [PFObject])
if let objects = objects as? [PFObject] {
PhotoInfoArray = objects // This is the global array that stores photo information, date created, etc.
}
} else {
println("Error: \(error!) \(error!.userInfo!)")
}
}
}
func getImageData(objects: [PFObject]) {
for object in objects {
let thumbNail = object["Image"] as PFFile
thumbNail.getDataInBackgroundWithBlock({
(imageData: NSData!, error: NSError!) -> Void in
if (error == nil) {
let image = UIImage(data:imageData)
//image object implementation
imageArray.append(image!)// this is the global array that stores the actual pictures
// println(image)
}
})//getDataInBackgroundWithBlock - end
}//for - end
}
这些函数使用 Parse 作为后端。
tableView 具有重新加载它的内置功能,在第一个视图中将显示前 20 个项目已加载,然后,当您滚动 table 时,另外 20 个项目被加载到 table ,所有的方法都被再次调用。所以不需要使用刷新。
我认为跟踪数组中的实际内容可能是个好主意,因为我从未见过 self.tableView.reloadData() 不起作用的情况。
我建议在 viewWillAppear 或 viewDidAppear 中打印数组。
如果您需要像这样等待其他进程完成,那么添加一个成功调用可能会很方便:
func someFunction(success: ((success: Bool) -> Void))) {
//Perform some tasks here
success(success: true)
}
然后在 viewcontroller 中预期结果如下所示:
someFunction({ (bool) -> Void in
if bool {
self.tableView.reloadData()
}
})
您的获取调用很可能是异步的(在后台完成),因此当您的代码点击 reloadData 时,尚未收到数据。您当前的代码取决于同步执行。 因此,您想在 fetch 调用的回调(或委托方法)中执行 reloadData 调用。也许研究一下最适合这类事情的闭包。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html
也许你可以展示一些你的抓取代码..