2016-07-31 9 views
2

これをしばらくの間把握しようとしていて、解決策を探して数時間後に私はそれを聞く時間だと決めました。セル内の画像をタップすることでUITableViewCellのSegue

カスタムUITableViewCellsによって読み込まれるテーブルビューがあります。現在、セルをタップすると詳細ビューに移動します。

カスタムセル内にイメージがあります。ユーザーがそのイメージをタップし、イメージを表示するポップオーバーVCにセグメンテーションできるようにしたいと思います。

私が問題を抱えているのは、画像がタップされたときにセグを作成することです。私ものカスタムセルファイル内の関数を持っている

override func awakeFromNib() { 
    super.awakeFromNib() 

    let tap = UITapGestureRecognizer(target: self, action: #selector(PostCell.voteTapped(_:))) 
    let ptap = UITapGestureRecognizer(target: self, action: #selector(PostCell.imageTapped(_:))) 
    tap.numberOfTapsRequired = 1 
    ptap.numberOfTapsRequired = 1 
    voteImage.addGestureRecognizer(tap) 
    voteImage.userInteractionEnabled = true 
    featuredImg.addGestureRecognizer(ptap) 
    featuredImg.userInteractionEnabled = true 


} 

:カスタムセルのためのファイルで

は、私がイメージ (PTAP)上でタップジェスチャー認識を設定しましたタップ:

:私のビューコントローラファイルで

func imageTapped(sender: UIGestureRecognizer) { 

    print("image tapped") 


} 

私はインデックスパスで行った選択行のセグエを追加しました

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    let post: Post! 

    if inSearchMode { 
     post = filteredVenues[indexPath.row] 
    } else { 

     post = posts[indexPath.row] 
    } 

    print(post?.venueName) 

    performSegueWithIdentifier("imageTapped", sender: nil) 



    performSegueWithIdentifier("DetailsVC", sender: post) 

} 

また、ストーリーボードでは、VCからカスタムセルを含むテーブルビューを保持するVCからSegueを作成しました。これは、画像がタップされたときに表示したいVCです。

私はこれを動作させるためにいくつかの方法を試しましたが、幸運を覚えていませんでした。カスタムセルファイルのタップ機能とVCファイルのセグがソリューションの一部であると感じているので、私はそれらを残しておきます。

何か助けていただければ幸いです。ありがとう!

メインVC

デルを割り当て
weak var delegate:postCell? 

追加プロトコル

protocol ImageSegueProtocol: class { 
    func imageTapped(row: Int) 
} 


class PostCell: UITableViewCell { 

追加IABのFunc

@IBAction func imageTapped(sender: UIGestureRecognizer) { 
    guard let row = row else { return } 
    delegate?.imageTapped(row) 
    print("image tapped func") 
} 

宣言デリゲート:以下の回答からコーディングする

アップデートあなたがする必要がどのようなゲート

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    //let post = posts[indexPath.row] 

    if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell { 

     var img: UIImage? 
     var vImg: UIImage? 
     postCell?.delegate = self 

追加拡張機能

extension FeedVC: ImageSegueProtocol { 

func imageTapped(row: Int) { 
    if inSearchMode == true { 
     let object = filteredVenues[row] 
     performSegueWithIdentifier("imageTapped", sender: object) 
     print("ext func") 
    } else { 
     let object = posts[row] 
     performSegueWithIdentifier("imageTapped", sender: object) 
     print("ext func") 
    } 



} 
+0

あなたは、テーブルビューのセルにデリゲートを作成しました:あなたがセグエ前に、任意の設定を行いたい場合は

その後、最初のVCであなたのようなものがあるだろうか? –

+0

ちょっと蘭、私はしなかった – ryanbilak

答えて

0

ではなく、画像のボタンを作成することであり、このボタンは、実際の画像を保持します:

enter image description here

を残りは簡単です、あなたのカスタムセルファイルにIBActionをドラッグしてください。 segueメソッドを呼び出すには、View Controllerと通信する必要があります。

あなたが達成することができ、その2つのデザインパターン使用:post notification使用

  1. を:

    あなたのビューコントローラ内部の観察者追加:あなたのビューコントローラ内

    NSNotificationCenter.defaultCenter().addObserver(self, 
              selector: #selector(YourViewController.cellSelected(_:)), 
              name: "CellSelectedNotificationName", 
              object: nil) 
    

    あなたの方法cellSelectedをすべき次のようになります。

    あなたのボタンのIBAction方法であなたCustomCellクラス内

    :ナットシェルで

    @IBAction func buttonTapped() 
    { 
        // Prepare the object you want to pass... 
        NSNotificationCenter.defaultCenter().postNotificationName("CellSelectedNotificationName", object: YourCustomObjectYouWantToPass) 
    } 
    

    、セル内のボタンをタップして、あなたはそのセル内のオブジェクトを作成し、あなたはビューに渡します通知センターを使用するコントローラ。今、あなたはカスタムオブジェクトでセグをすることができます。

:あなたは別のビューコントローラにあなたがUIButton(ストーリーボードで)から基本的にCTRL +ドラッグをできるオブジェクトを渡す必要がない場合。

  1. View Controllerをポイントしているdelegateを使用します。

幸運。

+0

オハードに感謝、私はこれを試してみます。 VCに指摘する必要のあるデリゲートについての情報を教えてもらえますか? – ryanbilak

+0

各デザインのリンクを追加しました。あなたがまだそれを取得しない場合は、私に例を追加することをお知らせください。 – OhadM

+0

大変ありがとうございます、私は見て、必要に応じてあなたに戻ってきます – ryanbilak

3

あなたはこのようにそれを行うことができます:、セルファイル内

上部のプロトコルを宣言して、タップされている画像に応答して細胞クラス自体と、デリゲートの行動の中にいくつかのプロパティを設定します。

protocol SomeCellProtocol: class { 
    func imageTapped(row: Int) 
} 


class SomeCell: UITableViewCell { 

    weak var delegate: SomeCellProtocol? 
    var row: Int? 

    @IBAction func imageTapped() { 
     guard let row = row else { return } 
     delegate?.imageTapped(row) 
    } 
} 

次に、あなたのViewControllerがSomeCellProtocolを採用し、そのような内セグエを呼び出して行う必要があります。

extension SomeViewController: SomeCellProtocol { 

    func imageTapped(row: Int) { 
     //get object from array and call segue here 
    } 
} 

そして、あなたはあなたのヴィ設定する必要があります

someCell.delegate = self 

とセルに行を渡す:

someCell.row = indexPath.row 

のViewControllerのごcellForRowAtIndexPathメソッド内で呼び出すことで、あなたの細胞のデリゲートとしてwController。

ボタンがセル内でタップされている場合(または、必要ならばImageViewのGestureRecognizerで行うこともできます)、デリゲート(ViewController)はimageTapped関数を呼び出して、 Segueを介してテーブルのどのオブジェクト(対応するデータ配列)を渡すべきかを判断するために使用することができます。

+0

Rossさん、ありがとうございます。VCエクステンションのアレイからオブジェクトを取得するのを手伝ってもらえますか?ちょうどあなたが何を意味するかについての何らかの説明が必要です。 – ryanbilak

+0

基本的に、どのオブジェクトを詳細に表示するかを知る必要があります。 あなたはセルに行を渡し、デリゲートメソッドで行を返します。その行を使用して配列からオブジェクトを取得してください: 検索モードの場合はobject = filteredVenues [row] let object = posts [行]もしそうでなければ! – RossP

+0

おかげでこのように見えますか? '拡張FeedVC:ImageSegueProtocol { FUNCのimageTapped(行:INT){ inSearchMode ==真{ LETオブジェクト= filteredVenues [行] performSegueWithIdentifier場合( "imageTapped"、送信者:なし) }他{ LETオブジェクト=記事[行] performSegueWithIdentifier( "imageTapped"、送信者:ゼロ) } } } 'とデリゲートは、次のようになります。' PostCell()デリゲート= self' PostCellは私のカスタムセル – ryanbilak

0

OhadM氏によると、ボタンを作成し、背景イメージを表示するイメージとして設定します。そこから、あなたはIBActionも必要ありません。 ボタンから次のView Controllerにドラッグ&ドロップして、セグメントを作成します。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     if segue.identifier == "imageButtonPressed" { // Make sure you name the segue to match 

      let controller = segue.destinationViewController as! SecondVC 
      controller.someText = "Hi" 
      controller.someInt = 5 
     } 
} 
関連する問題