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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

384閲覧

swift4で発生する"Variable used within its own initial value"とUITapGestureRecognizerの使い方

shotakeu

総合スコア386

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/07/16 03:39

サポートの終わってしまった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

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

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

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

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

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

t_obara

2019/07/16 05:46

[Variable used within its own initial value]についてですが、エラーメッセージの通りなので、少なくともUITapGestureRecognizerの戻りを保存するための変数名を変えると良いかと思いますが、それを設定する場所としては不適切かと。タップするたびに設定する必要はないですよね。(問題に対する本質的な回答ではありません)
guest

回答1

0

自己解決

自己解決させてから長らく放置してしまいました。

tableViewメソッドに関して下記のように書き直しました。
toSingleTweetViewメソッドは廃止して、別のアプローチでやりたいことを実現させることが出来ました。

下記はそのコードです。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("第(indexPath.section)セクションの(indexPath.row)番セルが選択されました") let tweet = tweets[indexPath.row] var singletweetVC: UIViewController! singletweetVC = SingleTweetViewController(tweet: tweet) self.navigationController?.pushViewController(singletweetVC, animated: true)

回答してくださった方々ならびに閲覧してくださった方々、長らくの放置申し訳ありませんでした。
とりあえずエラー状態は脱することができたので一応一度解決済みとさせていただきます。

投稿2019/09/07 09:27

shotakeu

総合スコア386

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問