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()
}

还要确保你的tableViewdelegatedatasource连接到你的视图控制器。这可能需要把它放在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问题的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 背景颜色 Swift

如何将这个 Objective-C 代码片段写入 Swift?

UITableView Swift问题

Swift:UIView 出现在 UITableView 单元格中

使用 swift 以编程方式 UITableView

Swift 3:有弹性的 UITableView 页脚