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

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

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

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Swift

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

Q&A

1回答

2343閲覧

TwitterKitを用いてタイムラインを表示させたいがうまく表示されない。

R-kwsk

総合スコア9

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Swift

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

0グッド

1クリップ

投稿2018/01/14 15:08

###前提・実現したいこと
始めて2週間程度のプログラミング初心者です。至らない点多々あるかと思いますがよろしくお願いします。
目標としているアプリ開発に必要な機能をとりあえずの理解で構わないので実装したいと思い、各サイトを参考にしながら作業しています。
今回は以下サイトを参考に作業しております。Twitterのタイムラインを取得、表示したいと思っております。
リンク内容

###発生している問題・エラーメッセージ

タイムラインを表示させようと思っている画面に遷移すると、以下のスクリーンショットのようになってしまいうまく表示されません。どこに問題があるのか教えていただきたいです。
イメージ説明

###該当のソースコード
ViewController.swift

swift

1import UIKit 2import TwitterKit 3 4class ViewController: UIViewController { 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 self.navigationItem.title = "login" 10 let logInButton = TWTRLogInButton { (session, error) in 11 if let unwrappedSession = session { 12 let alert = UIAlertController(title: "Logged In", 13 message: "User (unwrappedSession.userName) has logged in", 14 preferredStyle: UIAlertControllerStyle.alert 15 ) 16 alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)) 17 self.present(alert, animated: true, completion: nil) 18 } else { 19 NSLog("Login error: %@", error!.localizedDescription); 20 } 21 } 22 logInButton.center = self.view.center 23 self.view.addSubview(logInButton) 24 } 25 26 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 27 let session = sender as? TWTRSession 28 let dest = segue.destination as! TimelineViewController 29 dest.title = session?.userName 30 dest.userId = session?.userID 31 } 32 33 34 override func didReceiveMemoryWarning() { 35 super.didReceiveMemoryWarning() 36 // Dispose of any resources that can be recreated. 37 } 38}

TimelineViewController.swift

swift

1import Foundation 2import TwitterKit 3 4class TimelineViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 5 var tableView: UITableView! 6 var tweets: [TWTRTweet] = [] { 7 didSet { 8 tableView.reloadData() 9 } 10 } 11 var prototypeCell: TWTRTweetTableViewCell? 12 var userId: String? 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 tableView = UITableView(frame: self.view.bounds) 17 tableView.delegate = self 18 tableView.dataSource = self 19 20 prototypeCell = TWTRTweetTableViewCell(style: .default, reuseIdentifier: "cell") 21 22 tableView.register(TWTRTweetTableViewCell.self, forCellReuseIdentifier: "cell") 23 self.view.addSubview(tableView) 24 25 loadTweets() 26 } 27 28 func loadTweets(){ 29 TwitterAPI.getHomeTimeline(user: userId, tweets: { 30 twttrs in 31 for tweet in twttrs { 32 self.tweets.append(tweet) 33 } 34 }, error: { 35 error in 36 print(error.localizedDescription) 37 }) 38 } 39 40 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 41 return tweets.count 42 } 43 44 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 45 let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TWTRTweetTableViewCell 46 47 let tweet = tweets[indexPath.row] 48 cell.configure(with: tweet) 49 50 return cell 51 } 52 53 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 54 let tweet = tweets[indexPath.row] 55 56 prototypeCell?.configure(with: tweet) 57 58 if let height: CGFloat = TWTRTweetTableViewCell.height(for: tweet, style: .regular, width: self.view.bounds.width, showingActions: true){ 59 return height 60 }else{ 61 return tableView.estimatedRowHeight 62 } 63 } 64} 65

TwitterAPI.swift

swift

1import Foundation 2import TwitterKit 3 4// Timelineを取得 5class TwitterAPI { 6 let baseURL = "https://api.twitter.com" 7 let version = "/1.1" 8 9 init() { 10 11 } 12 13 class func getHomeTimeline(user:String?, tweets: @escaping ([TWTRTweet]) -> (), error: @escaping (NSError) -> ()) { 14 let client = TWTRAPIClient(userID: user) 15 var clientError: NSError? 16 let api = TwitterAPI() 17 let path = "/statuses/home_timeline.json" 18 let endpoint = api.baseURL + api.version + path 19 let request:NSURLRequest? = client.urlRequest(withMethod: "GET", url: endpoint, parameters: nil, error: &clientError) as NSURLRequest? 20 21 if request != nil { 22 client.sendTwitterRequest(request! as URLRequest, completion: { 23 response, data, err in 24 if err == nil { 25 var jsonError: NSError? 26 let json:AnyObject? = try! JSONSerialization.jsonObject(with: data!) as AnyObject? 27 if let jsonArray = json as? NSArray { 28 tweets(TWTRTweet.tweets(withJSONArray: jsonArray as! [Any]) as! [TWTRTweet]) 29 }else{ 30 error(err as! NSError) 31 } 32 }else{ 33 print("request error: (err)") 34 } 35 }) 36 } 37 } 38}

###手順
Timeline ViewボタンをタップするとTimeline View Controllerに遷移します(以下のスクリーンショットを参考)。
アプリを立ち上げTwitterにログインし、該当の画面に遷移すると上記スクリーンショットで示したような画面になってしまいます。
イメージ説明

###補足情報(言語/FW/ツール等のバージョンなど)
Swift 4.0.3
Xcode 9.2
CocoaPods 1.4
TwitterKit 3

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

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

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

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

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

guest

回答1

0

ViewController.swiftの
let session = sender as? TWTRSession
が間違いです

let session = TWTRTwitter.sharedInstance().sessionStore.session()
に修正してください。

あとアラートコントローラーとTimelineViewControllerへの遷移がバッティングするので
print()で色々試してください。

ストーリーボードでボタンを設置しなくていいですよ

投稿2018/04/30 14:11

vasucodagama

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問