4

viewDidLoad() で callapi() 関数を呼び出すと、callapi の println() は Post オブジェクトを含む posts 配列を出力しますが、viewDidLoad() 関数内の println() は空の配列を出力します。また、プロジェクトをビルドすると、「致命的なエラー: 配列インデックスが範囲外です」というエラーが表示されます。tableView 関数の println() ステートメントも空の配列を出力します。API からのデータが到着する前にテーブルがレンダリングされたようですが、どうすれば解決できますか?

var posts = [Post]()

override func viewDidLoad() {
    super.viewDidLoad()
    callapi()
    println(self.posts)
}

func callapi(){
    request(.GET, "url")
    .responseJSON { (request, response, data, error) in
        let json = JSON(data!)
        if let jsonArray = json.array {
            for post in jsonArray {
                var onepost = Post(id:post["id"].stringValue,                    

              title:post["title"].stringValue, 
              author:post["author"].stringValue, 
              post:post["post"].stringValue,   
              created_on:post["created_on"].stringValue, 
              updated_on:post["updated_on"].stringValue)
                self.posts.append(onepost)
                println(self.posts)
                self.tableView.reloadData()
            }
        }
    }
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath
 indexPath: NSIndexPath) -> UITableViewCell {
    let cellIdentifier = "Cell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier,
    forIndexPath: indexPath) as! CustomTableViewCell

    println(self.posts)
    let post = self.posts[indexPath.row]
    // Configure the cell...
    cell.titleLabel!.text = self.posts[indexPath.row].title
    cell.postLabel.text = post.post
    println(self.posts)
    return cell
}
4

3 に答える 3

3

viewDidLoad呼び出されると、非同期が開始callapiされますが、viewDidLoad終了するまでpostsはまだ空です。ただし、テーブル ビューはデータが入力されていなくても初期ロード プロセスを続行するため、この時点で が 0postsを返すことを確認する必要があります。tableView:numberOfRowsInSection:

その後、callapiAlamofireGETリクエストを終了し、 を呼び出しますreloadData。この時点でのみ、tableView:numberOfRowsInSection:ゼロ以外の値を返す必要があります。

tableView:numberOfRowsInSection:要するに、 が実際のエントリ数を に返すことを確認postsすれば、問題は解決するはずです。

于 2015-04-19T11:03:30.707 に答える
2

viewDidAppear にリロードを挿入するだけで、準備完了です。

override func viewDidAppear(animated: Bool) {
        self.tableView.reloadData()
    }
于 2016-09-26T20:48:03.633 に答える
0

tableView:numberOfRowsInSection: を設定して self.posts.count を返すようにしてください

于 2015-04-19T11:02:50.210 に答える