2017-12-10 19 views
0

대리자를 사용하여 뷰 컨트롤러의 데이터를 올바른 셀 수를 표시하는 TableView 클래스로 전달하려고합니다. TableViewCell 클래스 내부View Controller에서 Swift 클래스의 메시지 전달

protocol GroupBillVCDelegate{ 
    func passFriendArray(string: String) 
} 

... 
class GroupBillViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{ 
    var delegate:GroupBillVCDelegate? // for delegate passing message 

    ... 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     if (tableView == self.FriendTableView){ 
      let friendListCell = tableView.dequeueReusableCell(withIdentifier: "friendListCell") as! CategoryRow 

      // transfer friends array to CategoryRow 
      self.delegate?.passFriendArray(string: "Hello There") 

      return friendListCell 
     } 
    } 
} 

:

class CategoryRow: UITableViewCell, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, GroupBillVCDelegate { 

    var s:String = String() 

    func passFriendArray(string: String) { 
     s = string 
     print(string) 
    } 

... 

    // used for horizontal scrolling 
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     passFriendArray(string: s) // message supposed to appear here 
     print ("TEST") 
     return 10 
    } 

... 

} 

내가 문제가 첫째, (대신 디버깅을 위해 여기에 문자열을 사용하여) 그 클래스에 배열 내의 ViewController 내부

를 전달하는 데 필요 위임을 설정합니다. 실행하면 콘솔에 메시지가 표시되지 않습니다. 왜 그것이 통과되지 않는가?

+0

여기서 'delegate'을 (를) 할당 하시겠습니까? – vacawama

+0

죄송합니다, GroupBillViewController 클래스의 밑에있었습니다 – gorilla

+0

당신은'delegate' 선언문을 가지고 있습니다 만, 당신이 값을 지정할 때까지'nil'을 의미합니다. – vacawama

답변

0

대리인이 귀하의 비서실에 연결될 수있는 인터폰으로 생각하십시오.

이 줄 :

var delegate:GroupBillVCDelegate? // for delegate passing message 

는 인터콤을 정의하지만, 아무것도에 연결하지 않습니다. 인터콤의 버튼을 누르면 아무 것도 연결되지 않습니다.

self.delegate?.passFriendArray(string: "Hello There")

이 존재하는 경우 대리인에게 메시지를 보내고, 어떤 위임이없는 경우 메시지를 삭제하기 위해 "선택 체인"을 사용하는 코드입니다.

것은 당신이 대리인에게 뭔가를 할당됩니다 놓치고 :

self.delegate = someObjectThatConformsToGroupBillVCDelegateProtocol 

대리자는 일대일 관계입니다.

이 모든 것은 뷰 컨트롤러를 뷰 컨트롤러의 델리게이트로 만드는 것이 실제로 의미가 없다는 것을 의미합니다. 표보기에는 둘 이상의 셀이 있습니다. 어떤 셀이 뷰 컨트롤러의 델리게이트가되어야합니까? 왜 그 세포가 아닌 다른 세포입니까?

+0

self.delegate = someObjectThatConformsToGroupBillVCDelegateProtocol이 Sender 또는 Receiver 클래스 안에 있습니까? 그리고 그 진술의 오른쪽에 대한 수신기 클래스의 객체를 인스턴스화해야합니까? – gorilla

+0

대리자가있는 개체 안에 있어야합니다. 당신의'GroupBillViewController' 객체에,이 경우. (나는이 컨텍스트에서'Sender'와'Receiver'라는 용어를 어떻게 사용하는지 모르겠습니다.) 당신의 델리게이트 객체를 생성하는 방법에 대해서는 잘 모르겠습니다. 그것은 그것이 무엇이고 누가 그것을 소유하고 있는지에 달려 있습니다. –