2017-09-19 3 views
0

私はSwiftを使ってiOSアプリケーションを開発しています。セルビューを表示するには、セル行を選択するか、そのセル行のコンテンツビュー内のボタンを選択してください。テーブルビューを含む元のビューコントローラは、2つの異なる場合にセグを実行します:セル行自体が選択されたとき(seplayerがavplayerviewcontrollerになり、選択されたセル行に応じてビデオを再生する)、セグテーブルビューセルのコンテンツビューの内側にあるボタンを押します。最初のsegueでは、最初のsegueをオーバーライドするときにif let indexPath = self.tableview.indexPathForSelectedRowで選択されたセル行を渡すことができます。しかし、ボタンを押したときに起こる2番目のセグを無効にしようとすると、選択されたセル行を渡そうとすると機能しません。これは、テーブルビューセル内のボタンが選択された行を知らないためですか?もしそうなら、私はこの問題をどのように解決できますか?そのような問題を解決する実行可能な解決策は何ですか?注意:セル行を選択すると「playDrill」セグがトリガーされ、同じセル行のコンテンツビュー内のボタンを選択すると「ヒント」セグがトリグになりますセグのテーブルビューのセル行を選択するには?

最初のセグのコードは、セル行(このセグエ機能、必要に応じて):

class DrillsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "playDrill" { 
     if let indexPath = self.tableView.indexPathForSelectedRow { 
      if initialRow == 1 { 
       drillVid = videoURL[indexPath.row] 
       playerViewController = segue.destination as! PlayerController 
       playerViewController.player = AVPlayer(playerItem: AVPlayerItem(url: drillVid)) 
       playerViewController.player?.play() 
       print(indexPath) //prints correct value which is "[0,6]" 
      } 
      if initialRow == 3 { 
       drillVid = videoUrl[indexPath.row] 
       playerViewController = segue.destination as! PlayerController 
       playerViewController.player = AVPlayer(playerItem: AVPlayerItem(url: drillVid)) 
       playerViewController.player?.play() 
      } 

コードあなたはセルのコンテンツビュー内のボタンを選択したときに(私はこのセグエは、最初のセグエのようにindexPathの値を持つようにしたいトリガー秒セグエのためのしかし、そのコードを使用しようとすると正しい値が返されません)。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "Tips" { 
     if let indexPath = self.tableview.indexPathForSelectedRow { 
     if initialRow == 1 { 
      print(indexPath) //the value printed is "6", I want "[0,6]" like the first code block 
      let tipVC = segue.destination as! KeysController 

      } 
     } 
    } 
} 
+1

に私はそんなに書くことによって、あなたの質問をした考え方より多くの混乱、それがなければならないよりも思えます。ボタンのIBActionのコードはどこですか? – Shades

答えて

0

あなたが実際にセルを選択されていないため、選択したセルの選択されたインデックスを取得することができません。セル内のボタンを押しています。

ボタンのスーパービュー(セル)を取得し、そのセルのindexPathを取得することができます。

class TableViewController: UITableViewController { 

    var indexPathForButton: IndexPath? 

    @IBAction func buttonPressed(_ sender: UIButton) { 

     let button = sender 
     let cell = button.superview!.superview! as! MyCell // The number of levels deep for superviews depends on whether the button is directly inside the cell or in a view in the cell 
     indexPathForButton = tableView.indexPath(for: cell) 
    } 

その後prepare(for segue:)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "Tips" { 
     if initialRow == 1 { 
      print(indexPathForButton) 
      let tipVC = segue.destination as! KeysController 
     } 
    } 
} 
+0

ありがとうございました!これは私が必要としていたもので、緑色のチェックをして投票しました。 –

+0

最初のコードブロックはどこに行きますか?私はテーブルビューコントローラを持っていません。私はビューコントローラの内部にテーブルビューを持っています。 –

+0

View Controllerクラスに配置します。あなたのボタンにはすでにIBActionがありますか? – Shades

0

私は決してtableview.indexPathForSelectedRowを使用したことがありませんでした(そして、それがあなたの問題の原因であるかどうかはわかりません)が、indexPathオブジェクトをsenderとして送信することをお勧めします。これにより、prepareForSegueの中にtableview.indexPathForSelectedRowをチェックする必要がなくなります。例えば、

  • あなたはこのindexPathへのアクセス権を持っているし、単にsenderとしてそれを渡すことができtableView(UITableView, didSelectRowAt: IndexPath)であなたの"playDrill"セグエをトリガすることができます。
  • "Tips" segueをトリガするときに、このindexPathオブジェクトを送信者として渡すこともできます。参照を持っている一つの方法は、あなたのセルをデキューするときindexPathオブジェクトを保持し、設定ボタンアクションをableView(UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath)

にそれがあなたの助け場合、私に教えてくださいすることです!乾杯、

ジュリアン

+0

答えを実装するコードにリンクしたり、コードを提供したりできますか?それは有効だと思うけど、私はスイフトの初心者なので少し問題がある!あなたの答えは非常に高く評価されています! –

1

私はこの問題を数ヶ月前にも持っていました...最終的に私は、次のタスクとそれを解決することができました:

  1. は定義し、あなたのTableViewCell.swiftファイルに

  2. XYTableViewCellDelegateプロトコルを作成し、あなたの対応TableViewCell

  3. にボタンのアウトレットとアクションを作成します。以前の代理人TableViewCell代理人のTableViewCellクラス

  4. は、テーブルビューにも実装されているあなたのViewControllerクラスにデリゲートを追加するには、テーブルビュー

  5. cellForRowAt:機能であなたのデリゲートを定義

  6. 最後だけ

  7. indexpathタップボタンのテーブルビューを受け取るためにあなたのViewControllerでこの関数を作成

さらに詳しいヘルプが必要な場合は、ViewController全体をコピー/ペーストしてください。&ここでTableViewCellクラスを作成してください。コード内で直接変更を行うことができます。


これは、次のコードのようになります。

// FILE VIEWCONTORLLER 
// -> 5. 
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, XYTableViewCellDelegate { 

    // ... view did load stuff here 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell:TripDetailsTableViewCell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell 

     // -> 4. 
     cell.delegate = self 

    // ... 
    } 

    // -> 6. 
    func buttonTappedViewCellResponse(cell: UITableViewCell) { 
    let indexPath = tableView.indexPath(for: cell) 
    // do further stuff here 
    } 
} 


// FILE TABLEVIEWCELL 
// -> 2. 
protocol XYTableViewCellDelegate { 
    func buttonTappedViewCellResponse(cell:UITableViewCell) 
} 
class XYTableViewCell: UITableViewCell { 
    // -> 1. 
    @IBOutlet weak var button: UIButton! 

    // -> 3. 
    var delegate: XYTableViewCellDelegate? 

    // -> 1. 
    @IBAction func buttonAction(_ sender: Any) { 
    self.delegate?.buttonTappedViewCellResponse(cell: self) 
    } 
} 
+0

数字を表す矢印は何ですか? –

+0

コードの上に私はtodos 1 - 6を挙げました。コード内の矢印は対応するリスト項目 – AlexWoe89

+0

を指していますので、// - > 1の場合はリスト1を意味します。ボタンのアウトレットとアクションを対応するTableViewCell – AlexWoe89

関連する問題