UITableView Swift问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UITableView Swift问题相关的知识,希望对你有一定的参考价值。
我想使用Parse查询将字符串添加到数组。然后我想把这些字符串放入我的UITableView的单元格中。但是,每次我运行应用程序时,似乎没有任何东西出现在我的桌子上。这是我的代码,如果有人可以帮助解释它可能没有出现的一些原因
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var friendsArray: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
var usrname = currentUser?.username
var query = PFQuery(className:"Relation")
query.whereKey("Sender", equalTo : usrname!)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
// The find succeeded.
//println("Successfully retrieved (objects) scores.")
// Do something with the found objects
if let objects = objects as? [PFObject] {
for object in objects {
var friendName = object["Friend"] as! String
println(friendName)
self.friendsArray.append(friendName)
}
}
}
else {
// Log details of the failure
println("Error: (error!) (error!.userInfo!)")
}
}
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return friendsArray.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as! UITableViewCell
cell.textLabel?.text = self.friendsArray[indexPath.row]
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
}
你需要在[self.tableView reloadData];
电话的完成块中调用findObjectsInBackground:
。
在if error == nil{...}
语句的末尾,加载您的表数据,如下所示:
if error == nil{
//All that other stuff...
tableView.reloadData()
}
还要确保你的tableView
有delegate
和datasource
连接到你的视图控制器。这可能需要把它放在viewDidLoad
:
tableView.delegate = self
tableView.datasource = self
我也发现你的tableView
被宣布为weak
是特殊的,但这可能不相关。
尝试这些事情,如果您仍然遇到麻烦,请告诉我们。祝好运! :)
应用程序不知道何时返回您的数据,因此您必须在成功接收数据后明确刷新UITableView。稍后使用[self.tableView reloadData]
重新加载UITableView。
UITableView仅在加载UIViewController时加载一次。除非,您已经拥有UIViewController加载时的数据。否则,第一次行数将为0,并且不会调用委托方法cellForRowAtIndexPath
。
当你查看文档时,findObjectsInBackgroundWithBlock
是一个异步调用。它不像它的字面含义,它在后台运行。这意味着它不会阻止当前线程,以便用户仍然可以与应用程序进行交互。
当你打电话给findObjectsInBackgroundWithBlock
时,它正在做它名字所说的,特别是它在后台运行。
同时,当它在后台运行时,您的表视图代码继续在前台运行,有效地并行运行。
所以你的viewDidLoad
函数将退出,接下来将调用numberOfRowsInSection
,但是当时findObjectsInBackgroundWithBlock
尚未完成,那么friendsArray.count将为0。
试试这些东西。它会帮助你获得元素数组后重新加载uitableView。如果你使用storyboard检查数据源插座,你没有使用storyboard或xib,那么你在编码wisse中设置数据源
嗨,你可以这样使用
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell
cell.textLabel?.text = app.str[indexPath.row]
print(" cell (cell.textLabel?.text!)")
return cell
}
TableOutLet.reloadData()
- 在super.viewDidLoad()之后,通过在viewDidLoad()中的两行写下来将tableView与其委托和数据源相符合: tableView.datasource = self tableView.delegate = self
- 然后更新此代码如下: 如果让objects =对象为? [PFObject] {对象中的对象{var friendName = object [“Friend”] as! String println(friendName)self.friendsArray.append(friendName)} tableView.reloadData()}
- 之后在tableView委托方法中为numberOfRows()方法返回self.friendsArray.count,并将代码也放在cellForRow中。
只需在数组中追加元素后放置您的行。
override func viewDidLoad() {
super.viewDidLoad()
var usrname = currentUser?.username
var query = PFQuery(className:"Relation")
query.whereKey("Sender", equalTo : usrname!)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
// The find succeeded.
//println("Successfully retrieved (objects) scores.")
// Do something with the found objects
if let objects = objects as? [PFObject] {
for object in objects {
var friendName = object["Friend"] as! String
println(friendName)
self.friendsArray.append(friendName)
}
}
}
else {
// Log details of the failure
println("Error: (error!) (error!.userInfo!)")
}
}
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
}
或者,您可以在最终阵列更新后重新加载表格
如另一个提示所示,您需要调用reloadData,但需要在主线程中调用它以尽快查看结果
dispatch_async(dispatch_get_main_queue()) {self.tableView.reloadData()}
以上是关于UITableView Swift问题的主要内容,如果未能解决你的问题,请参考以下文章
如何将这个 Objective-C 代码片段写入 Swift?