###前提・実現したいこと
始めて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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。