13
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FebricでTwitterのタイムラインを表示する(Xcode7.2版)

Last updated at Posted at 2015-12-31

FabricでTwitterのタイムラインを表示する

元ネタのリンクはこれです。
http://qiita.com/mokumoku/items/bf0460f420acac3c04fc
http://qiita.com/makora9143/items/5bdbab674bea55f56a81
しかしFebricのバージョン更新があったのか、上記のリンクのコードではdeprecate警告が出ていたので、適切な形に修正しました。

修正したコード

コード差分

TwitterAPI.swift

-  class func getHomeTimeline(tweets: [TWTRTweet]->(), error: (NSError) -> ()) {
+  class func getHomeTimeline(user: String?, tweets: [TWTRTweet]->(), error: (NSError) -> ()) {
     let api = TwitterAPI()
+    let client = TWTRAPIClient(userID: user)
     var clientError: NSError?
     let path = "/statuses/home_timeline.json"
     let endpoint = api.baseURL + api.version + path
-    let request:NSURLRequest? = Twitter.sharedInstance().APIClient.URLRequestWithMethod("GET", URL: endpoint, parameters: nil, error: &clientError)
+    let request:NSURLRequest? = client.URLRequestWithMethod("GET",
+      URL: endpoint,
+      parameters: nil,
+      error: &clientError)

     if request != nil {
-      Twitter.sharedInstance().APIClient.sendTwitterRequest(request!, completion: {
+      client.sendTwitterRequest(request!, completion: {
         response, data, err in
         if err == nil {
           let json: AnyObject? =  try! NSJSONSerialization.JSONObjectWithData(data!,

Twitterクラスのメンバの一部がdeprecateされるようなので、代わりにTWTRAPIClientクラスを使用します。
ここで、loginした際に返されるTWTRSession情報からuserIdを渡しておきます。

サンプルとしてカスタムしたLoginViewControllerクラスと TimelineViewControllerクラスを記載しておきます。

LoginViewController.swift
import UIKit
import TwitterKit


class LoginViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    /*
    let logInButton = TWTRLogInButton { (session, error) in
      if session != nil {
        //self.performSegueWithIdentifier("main", sender: session!.userName)
        self.performSegueWithIdentifier("timeline", sender: session!.userName)
      } else {
        NSLog("Login error: %@", error!.localizedDescription);
      }
    }
    
    // TODO: Change where the log in button is positioned in your view
    logInButton.center = self.view.center
    self.view.addSubview(logInButton)*/
    
    
    Twitter.sharedInstance().logInWithCompletion { session, error in
      if (session != nil) {
        print("signed in as \(session!.userName)");
        self.performSegueWithIdentifier("timeline", sender: session)
      } else {
        print("error: \(error!.localizedDescription)");
      }
    }

  }
  
  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let session = sender as? TWTRSession
    let dest = segue.destinationViewController as! TimelineViewController
    dest.title = session!.userName
    dest.userId = session?.userID
    
  }
}

TimelineViewController.swift
import UIKit
import TwitterKit

class TimelineViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
  var tableView: UITableView!
  var tweets: [TWTRTweet] = [] {
    didSet {
      tableView.reloadData()
    }
  }
  var prototypeCell: TWTRTweetTableViewCell?
  
  var userId: String?
  
  override func viewDidLoad() {
    super.viewDidLoad()
    tableView = UITableView(frame: self.view.bounds)
    tableView.delegate = self
    tableView.dataSource = self
    
    prototypeCell = TWTRTweetTableViewCell(style: .Default, reuseIdentifier: "cell")
    
    tableView.registerClass(TWTRTweetTableViewCell.self, forCellReuseIdentifier: "cell")
    self.view.addSubview(tableView)
    
    loadTweets()
  }
  
  func loadTweets() {
    TwitterAPI.getHomeTimeline(userId,tweets: {
      twttrs in
      for tweet in twttrs {
        self.tweets.append(tweet)
      }
      }, error: {
        error in
        print(error.localizedDescription)
    })
  }
  
  // MARK: UITableViewDataSource
  func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // Return the number of Tweets.
    return tweets.count
  }
  
  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! TWTRTweetTableViewCell
    
    let tweet = tweets[indexPath.row]
    cell.configureWithTweet(tweet)
    
    return cell
  }
  
  // MARK: UITableViewDelegate
  func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    let tweet = tweets[indexPath.row]
    
    prototypeCell?.configureWithTweet(tweet)
    
    let height = TWTRTweetTableViewCell.heightForTweet(tweet, width: self.view.bounds.width)
    if !height.isNaN {
      return height
    } else {
      return tableView.estimatedRowHeight
    }
  }
}

最後に

Febricはすごく便利っぽいのですが、公式リファレンスやサンプルコードの情報が古かったり、不十分だったりするのでまだまだハマりどころは多そうです。
日本語の情報はすごく少ないので、もっと広まって情報共有していきたいですね。

ようやくこのライブラリにも取っ掛かりができたので、もう少し触ってみようかと思います。

Thanks

http://qiita.com/mokumoku
http://qiita.com/makora9143

13
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?