2017-09-19 11 views
0

저는 Swift를 사용하여 iOS 앱을 개발하고 있으며 셀 행을 선택하거나 셀 행의 내용보기 내부에있는 버튼을 선택하여 표보기 셀 내용보기에서 선을 긋는보기 컨트롤러가 있습니다. 테이블 뷰가 포함 된 원래보기 컨트롤러는 두 가지 경우에 세그먼트를 수행합니다. 셀 행 자체가 선택되면 (예 : avplayerviewcontroller에 연결되고 선택한 셀 행에 따라 비디오가 재생 됨) 두 번째 섹스가 발생합니다. 당신은 테이블 뷰 셀의 내용보기 내부에있는 버튼을 누릅니다. 첫 번째 segue에서 나는 첫 번째 segue를 덮어 쓸 때 if let indexPath = self.tableview.indexPathForSelectedRow으로 선택된 셀 행을 전달할 수 있습니다. 그러나 내가 선택한 셀 행을 전달하려고하면 버튼을 눌렀을 때 발생하는 두 번째 섹스를 무시하려고 할 때 작동하지 않습니다. 이것은 테이블 뷰 셀의 내부 버튼이 선택되어있는 행을 알지 못하기 때문입니다. 그렇다면이 문제를 어떻게 해결할 수 있습니까? 그렇다면 해결 방법은 무엇입니까? 알림 : 셀 행을 선택하면 'playDrill'세그먼트가 생성되고 동일한 셀 행의 콘텐츠보기에서 버튼을 선택하면 '팁'세그먼트가 생성됩니다.segue에서 선택된 테이블 뷰 셀 행을 얻는 방법?

코드를 선택하면 첫 번째 섹터 코드가 생성됩니다. 세포 행 (원하는대로이 SEGUE 기능) : 두 번째 SEGUE에 대한

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() 
      } 

코드는 셀의 내용보기의 내부에 버튼을 선택하면 트리거 (내가 처음 SEGUE 같이 indexPath의 값이이 SEGUE을 원하는 하지만 해당 코드를 사용하려고하면 올바른 값을 반환하지 않습니다.

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

prepare(for segue:) 내가 너무 당신이 당신의 질문이되어야합니다보다 훨씬 더 복잡한 것 같다 만들어를 작성하여 생각합니다. 버튼의 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) 
    } 

그런 다음

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

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

감사합니다! 이것은 내가 필요로하는, 녹색 체크하고 up-voted. –

+0

첫 번째 코드 블록은 어디에 있습니까? 테이블 뷰 컨트롤러가 없습니다. 보기 컨트롤러 내부에 테이블보기가 있습니다. –

+0

보기 컨트롤러 클래스에 넣습니다. 이미 버튼에 대한 IBAction이 있습니까? – Shades

0

나는 결코 tableview.indexPathForSelectedRow을 사용 해본 적이 없다. (그리고 좋은 연습은 아니지만, 문제가 있는지 여부는 확실하지 않다.) indexPath 개체를 sender으로 보내면 다른 방법을 시도해 볼 수도있다. 이렇게하면 prepareForSegue 안에 tableview.indexPathForSelectedRow을 확인하지 않아도됩니다. 예를 들어,

  • 당신은 당신이 indexPath에 액세스 할 수 있으며 단순히 sender로 전달할 수 있습니다 tableView(UITableView, didSelectRowAt: IndexPath)"playDrill" SEGUE을 트리거 할 수 있습니다.
  • "Tips" 세그먼트를 트리거 할 때이 indexPath 개체를 보낸 사람으로 보낼 수도 있습니다. 참조가하는 한 가지 방법은 당신이 당신의 세포를 큐에서 제거 할 때 indexPath 개체를 유지하고 설정 버튼 동작을 ableView(UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath)

에 그것이 당신 도움이된다면 알려줘입니다! 건배,

줄리앙

+0

나를 연결하거나 답을 구현하는 코드를 제공 할 수 있습니까? 그것은 유효하지만, 나는 스위프트에 초보자부터 다음과 같은 약간의 문제를 겪고 있습니다! 당신의 대답은 크게 감사드립니다! –

1

나는이 문제도 몇 달 전에 보았습니다.

  • 정의하여 TableViewCell.swift 파일에

  • XYTableViewCellDelegate 프로토콜을 만들기

    1. 당신이 TableViewCell 대응에 버튼의 아울렛과 활동 작성 : 마지막으로 나는 다음과 같은 작업으로 해결할 수 있었다 이전에 만든 대표 인 TableViewCellTableViewCell 클래스

    2. 가있는 TableView도 구현 당신의 ViewController 클래스에 대리자를 추가하여있는 tableview

    3. cellForRowAt: 기능에 대리자를 정의

    4. 마지막으로 단지

    5. indexpath 태핑 버튼의 tableview를받을의 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