2017-12-10 14 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")

が存在する場合、デリゲートにメッセージを送信、およびNOデリゲートがない場合はメッセージを削除する「オプションチェーン」を使用するコード。

あなたが不足しているしている事は、デリゲートに何かを割り当てることです:

self.delegate = someObjectThatConformsToGroupBillVCDelegateProtocol 

デリゲートは1対1の関係です。

これらのことは、ビューコントローラのデリゲートをテーブルビューのセルにすることは実際には意味がありません。テーブルビューには複数のセルがあります。 View Controllerのデリゲートはどのセルですか?なぜその細胞ではなく、別の細胞ですか?

+0

self.delegate = someObjectThatConformsToGroupBillVCDelegateProtocolは、SenderクラスまたはReceiverクラス内にありますか?そして、そのステートメントの右側のレシーバクラスのオブジェクトをインスタンス化する必要がありますか? – gorilla

+0

デリゲートを持つオブジェクトの内部にある必要があります。あなたの 'GroupBillViewController'オブジェクトでは、この場合です。 (私は、この文脈では 'Sender'と' Receiver'という言葉をどのように使うのか分かりません)。あなたの委譲オブジェクトを作成する方法については、私は分かりません。それはそれが何で、誰がそれを所有しているかによって異なります。 –

関連する問題