質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2387閲覧

Tableviewのcellに外部から取得した情報を入れたい

gtime

総合スコア51

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/04/21 13:42

swift

1import UIKit 2import TwitterKit 3 4class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 let endpoint = "https://api.twitter.com/1.1/statuses/home_timeline.json" 8 let client = TWTRAPIClient.init(userID: "000000000") 9 var clientError : NSError? 10 let params = ["count": "3"] 11 let request = client.urlRequest(withMethod: "GET", url: endpoint, parameters: params, error: &clientError) 12 client.sendTwitterRequest(request) { 13 (response, data, connectionError) -> Void in 14 if connectionError != nil { 15 print("エラー: \(connectionError)") 16 } else { 17 let json = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:Any]] 18 var myItems = [String]() 19 for obj in json { 20 let text = obj["text"] ?? "(empty)" 21 myItems += ["\(text)"] 22 } 23 } 24 } 25 } 26 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 27 return myItems.count 28 } 29 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 30 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath as IndexPath) 31 cell.textLabel!.text = "\(myItems[indexPath.row])" 32 return cell 33 } 34}

このようにしてTwitterのツイートを取得し、配列に追加したのですが
for obj in json {
let text = obj["text"] ?? "(empty)"
myItems += ["(text)"]
}
このようなエラーが出て実行できません
イメージ説明
どのようにすればセルに内容が表示されるかご教授いただけないでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

myItemsを宣言する場所が間違っています。viewDidLoad()の外でvar myItemsしてください。
関数の中で宣言(var, let)された変数は、その関数の中でしか使えません。
クラスの中で宣言することで、クラスの中で使えるようになります。「変数 スコープ」などで検索してください。

sendTwitterRequestはたぶん非同期通信だと思いますが、このハンドラの中でtableView.reloadData(); したほうがよいかもしれません。親クラスがUIViewControllerなので、self.tableViewは通らないかもしれませんが、その場合は適宜IBOutletなどでなんとかなるでしょう

Swift

1class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 2 var myItems = [String]() 3 override func viewDidLoad() { 4 // ... 5 client.sendTwitterRequest(request) { 6 (response, data, connectionError) -> Void in 7 if connectionError != nil { 8 print("エラー: \(connectionError)") 9 } else { 10 let json = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:Any]] 11 var myItems = [String]() 12 for obj in json { 13 let text = obj["text"] ?? "(empty)" 14 myItems += ["\(text)"] 15 } 16 self.tableView.reloadData(); 17 } 18 } 19 } 20}

投稿2017/04/21 14:11

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問