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

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

ただいまの
回答率

90.12%

Swift3でtableviewのcellの上にあるuibuttonをタップするタイミングで必要なデーターを遷移先に渡したい。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 874

bushi

score 38

Xcode 8.2.1
Swift3

掲示板アプリを作っているのですが1つわからなところがあり投稿しました。

ツイッターなどでも見られるUIで、つぶやいたユーザーのプロフィール画像をタップすると
タップしたユーザーのプロフィール画面に遷移するような仕組みを導入したいと思っています。

下記は制作中の画像をキャプチャしました。
赤丸をタップするとタップしたユーザーのプロフィールページに遷移したい。
イメージ説明

★現在できていること★
・赤丸のユーザー画像の上にはUIButtonをセットしているので「postUserProfileNextButton(UIButtonです)」にaddTargetでsegueまでできている。問題なくページ遷移もできている。

cell.postUserProfileNextButton.addTarget(self, action: #selector(profileViewNext(_:event:)), for: .touchUpInside)

・Firebaseを利用しているのでJSONで取得したデーターには投稿したユーザーのユーザーID(uid)があるのでそちらも取得まではできている。
このJSONデーターは下記の定数に入っている

 let dict = items[(indexPath as NSIndexPath).row] <=ここにFirebaseで取得したデータが入っている


下記はFirebaseのデーター画像。赤丸がユーザーIDでこれも問題なく取得できている。
イメージ説明

▼現在できてないところ▼
・ページ遷移するタイミング(segueするタイミング)で各ユーザーのユーザーID(uid)の渡し方がわからない。
UIButtonのtagを利用したら簡単に解決できると思ったけど、tagはInt型なので今回のようなString型のユーザーID(uid)はtagに利用できない。※と思っている。
・addTrgetの#selectorには好きな引数が利用できないのでfirebaseで取得したユーザーID(uid)を渡すことができない?

if let _userID = dict["uid"] as? String {
    cell.postUserProfileNextButton.tag = Int(_userID)! <= これだとエラーになる!
    cell.postUserProfileNextButton.addTarget(self, action: #selector(profileViewNext(_:event:)), for: .touchUpInside) <= #selectorでユーザーID(uid)を渡せない。
}


説明がヘタでごめんなさい。
最後に簡単にまとめますと、tableviewのcellの上にUIButtonがあるのでそれをタップすると各ユーザーのプロフィール画面に遷移まではできている。あとはどうやってユーザーIDをわたせばいいでしょうか。

ご教授願います。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

segueから対象viewControllerの実体を取ってきて、そこに設定しておいたプロパティに値をセットしておくのはどうでしょうか。

http://qiita.com/treastrain/items/8c298886cc8f3cf124f2

この記事の「画面遷移先に何かしらを受け渡したい場合」あたりが有用だと思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/28 22:06



    >segueから対象viewControllerの実体を取ってきて、そこに設定しておいたプロパティに値をセットしておくのはどうでしょうか。
    ご連絡ありがとうございます。
    1つ説明不足で申し訳ございません。
    教えていただきたviewControllerにプロパティに値をセットするという準備まではできております。
    大変もうしわけございません。

    現在は下記のようなプログラムになっております。

    cellの上においたボタンに対してaddTargetを設定
    cell.postUserProfileNextButton.addTarget(self, action: #selector(profileViewNext(_:event:)), for: .touchUpInside)

    addTargetで下記のメソッドを実行ができます。
    下記を実行するとsegueまでは問題なくできます。

    ただ、これだと引数には「sender」と「event」しか送れないので今回教えていただきたviewControllerのプロパティに値をセットすることができないように思います。
    ※僕がわからないだけかもしれません。

    func profileViewNext(_ sender: UIButton, event: UIEvent) {
    self.performSegue(withIdentifier: "UserProfileViewNext", sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "UserProfileViewNext" {
    let vc = segue.destination as! UserProfileViewController
    vc._uid = sender <= UserProfileViewControllerには「_uid」というプロパティがありここにセットするにはどうすればいいでしょうか?senderには必要な情報が入っていませんしおそらく入れることもできない?と思っています。それでbutton.tagを利用しようとしたのですがString型なので利用もできずという状態でした。
    }
    }

    もし、addTargetで好きな引数を渡せる方うほうなどがご存でしたら非常に助かります。
    例えば、
    #selector(profileViewNext(_:event:) <=ここの引数にユーザーIDなどはセットできますか?
    これができれば今回は解決すると思っています。

    宜しくお願い致します。

    キャンセル

+1

本来の使い方じゃないですが、使ってないのであればありかもですw

cell.postUserProfileNextButton.accessibilityLabel = "twitter_id"

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

check解決した方法

0

自己解決しました。

解決方法ですが、カスタムボタンを作成しユーザーIDを保持するプロパティを作成することで無事にaddTargetで取得することができました。

参考サイト
http://qiita.com/yasuralian/items/e8b88333f90e2d51d3ca

ストーリーボードにもカスタムクラスを設定。
@IBOutlet weak var postUserProfileNextButton: CustomButton!

cell.postUserProfileNextButton.uid = _uid
※buttonは今回作成したカスタムクラス

func profileViewNext(_ sender: CustomButton, event: UIEvent) {
    print(sender.uid)    
    self.performSegue(withIdentifier: "UserProfileViewNext", sender: sender)
}

printで取得した内容
おされた
KaxVQxguWIQjhz3IWXFh4zRWNBm2
おされた
jkk2jHj60VXrcBdnvCkiHfh84P12


こんな感じで押したボタンでユーザーIDを取得できました。

コメントをいただきました皆様ありがとうございます!!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • Swiftに関する質問
  • Swift3でtableviewのcellの上にあるuibuttonをタップするタイミングで必要なデーターを遷移先に渡したい。