2016-07-10 2 views
0

나는 Master-Detail 템플릿을 기반으로하는 신속한 응용 프로그램을 가지고 있습니다. MasterView 테이블의 모든 행은 펜촉에서 수신 한 사용자 정의 셀을 기반으로합니다. 모든 셀에는 UIlabelUIbutton이 포함됩니다. 응용 프로그램의 논리는 다음과 같습니다. 행의 사용자 탭이 DetailView이면 선택된 행에 따라 몇 가지 세부 사항이 표시됩니다. 행의 단추가 tableView(_, didSelectRowAtIndexPath)을 호출하지 않습니다. 사용자가 행 안의 버튼을 두드리면 이미지가 DetailView에 속해야하며 (DetailView의 다른 요소는 변경되지 않음) 변경되지 않아야합니다. 다른 행을 선택하고 이전 행을 뒤로 선택하는 경우 변경된 이미지는 예고 된대로 DetailView에 표시됩니다. 문제는 단추를 눌러서 DetailView에서 이미지를 다시 그리는 방법입니다. 나는 다음을 수행하려고 노력했지만 성공하지 :DetailView를 업데이트하는 방법

class MasterViewCell: UITableViewCell { 
    weak var detailViewController: DetailViewController? 

    @IBAction func buttonTap(sender: AnyObject) { 
     //method to set new image 
     detailViewController!.setNewImage() 
     detailViewController!.view.setNeedsDisplay()  
    } 
} 

class MasterViewController: UITableViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     let nib = UINib(nibName: "itemCell", bundle: nil) 
     tableView.registerNib(nib, forCellReuseIdentifier: "Cell") 
     if let split = self.splitViewController { 
      let controllers = split.viewControllers 
      self.detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController 
     } 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as? MasterViewCell 
     cell?.detailView = self.detailViewController 
     return cell! 
} 

답변

0

해결책을 찾았습니다. 프로토콜 위임 메커니즘을 사용했습니다. 이제 코드는 다음과 같습니다.

이 솔루션은 지나치게 복잡하지만 작동하기 쉽고 다양한 용도로 사용할 수 있습니다.

+0

귀하의 방법이 올바른 동안, 우리는 종종 마스터 -> 세부 통신에 위임을 사용하지 않습니다. detailView가 마스터에게 ** 회신을 원할 때 위임을 사용합니다. –

+0

@ 레이즈, 나는 동의한다. 그러나이 특정 문제에 대해서는 최상의 솔루션 인 것 같습니다. –

+0

당신 *** *** 내가 섹스에 대해 말하는 거 알아? –

0

당신은 핸들러에게

typealias ButtonHandler = (Cell) -> Void 

class Cell: UITableViewCell { 

    var changeImage: ButtonHandler? 

    func configureButton(changeImage: ButtonHandler?) { 
     self.changeImage = changeImage 
    } 


    @IBAction func buttonTap(sender: UIButton) { 
     changeImage?(self) 
    } 
} 

를 사용할 필요가 그리고 당신의 MasterView에

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
      let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! Cell 

      cell.configureButton(setNewImage()) 

      return cell 
     } 

     private func setNewImage() -> ButtonHandler { 
      return { [unowned self] cell in 
       let row = self.tableView.indexPathForCell(cell)?.row //Get the row that was touched 
       //set the new Image 
      } 
     } 

자료 제공 : iOS Swift, Update UITableView custom cell label outside of tableview CellForRow using tag

+0

고마워요. 그것은 작동합니다. 그러나 실제로 다른 솔루션을 찾았습니다. 더 유연하고 다른 용도로 사용할 수 있습니다. 아래 내 의견을 참조하십시오 –

관련 문제