サポートの終わってしまったTwitterKitを使ってオリジナルのTwitterクライアントをiOSで開発しています。
TwitterKitの中のTWTRTweetTableViewCell
というオブジェクトを使ったところ、どうにかホームタイムラインの表示までは機能したのですが、TableViewのcellをタップした時にTwitter本家アプリが開いてしまいます(
実機テストで確認)
そこで、cellをタップした時に別のViewControllerに引数としてデータを渡して個別のTweet画面を開こうと開発しているのですが、そこで下記の問題が起きています。
Variable used within its own initial value
というエラーがあって、先に進むことができずにおります。
下記、問題のコード
import UIKit import TwitterKit class TimelineViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, TWTRTweetViewDelegate { var tableView: UITableView! var rightBarButton: UIBarButtonItem! // テーブル表示用のデータソース var tweets: [TWTRTweet] = [] { didSet { tableView.reloadData() self.view.layoutIfNeeded() } } var singleTweet: TWTRTweet? var prototypeCell: TWTRTweetTableViewCell? var userId: String? private let refreshControl = UIRefreshControl() override func viewDidLoad() { super.viewDidLoad() // 投稿ボタン rightBarButton = UIBarButtonItem( title: "tweet", style: .plain, target: self, action: #selector(tappedRightBarButton(_:)) ) self.navigationItem.rightBarButtonItem = rightBarButton tableView = UITableView(frame: self.view.bounds) prototypeCell = TWTRTweetTableViewCell(style: .default, reuseIdentifier: "cell") tableView.register(TWTRTweetTableViewCell.self, forCellReuseIdentifier: "cell") tableView.delegate = self tableView.dataSource = self tableView.refreshControl = refreshControl refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged) self.view.addSubview(tableView) loadTweets() // バックボタン消しておく self.navigationItem.hidesBackButton = true } // 中略 // MARK: UITableViewDataSource func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return tweets.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // セルのためのテーブルビュー情報を,プレースホルダ識別子によって指定している let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TWTRTweetTableViewCell // for TWTRTweetViewDelegate to handling on select cell.tweetView.delegate = self // ツイート格納 let tweet = tweets[indexPath.row] let toSingleTweetView = UITapGestureRecognizer( target: self, action: #selector(toSingleTweetView(_ , tweet)) // ←該当箇所でエラー ) //error : Variable used within its own initial value cell.tweetView.addGestureRecognizer(toSingleTweetView) cell.tag = indexPath.row cell.configure(with: tweet) return cell } @objc func toSingleTweetView(_ sender:UITapGestureRecognizer, tweet: TWTRTweet) { var singletweetVC: UIViewController! singletweetVC = SingleTweetViewController(tweet: tweet) self.navigationController?.pushViewController(singletweetVC, animated: true) } // MARK: TWTRTweeetViewDelegate // tap a cell func tweetView(tweetView: TWTRTweetView!, didSelectTweet tweet: TWTRTweet!) { NSLog("ここtapとれない!!!!!!!") var singletweetVC: UIViewController! singletweetVC = SingleTweetViewController(tweet: tweet) self.navigationController?.pushViewController(singletweetVC, animated: true) }
試した事
-
TWTRTweeetViewDelegate
をselfにしてtweetViewメソッドを実装するも、まずここまで到達せずにWebViewが開き、urlから本家Twitterアプリが開いてしまいます。 -
これを防ごうと
UITapGestureRecognizer
を使って別メソッドを呼び出し(ここでいうtoSingleTweetView(_ sender:UITapGestureRecognizer, tweet: TWTRTweet)
の箇所を追記 -
しかし、
UITapGestureRecognizer
の初期化部分でVariable used within its own initial value
のエラーが出て先に進めず・・・
といった状況です。
当方、Swiftに関してはほぼ素人でして、無知な部分が多いのですが、それでも助言くださる方、よろしくお願いいたします。
参考にしたweb
回答1件
あなたの回答
tips
プレビュー