2017-02-27 4 views
0

私はこのtutorialにちょうど従い、カスタム代理人を作成しました。カスタム代理人alwayse nil

私はクラスHelpTableViewCell

弱いのvarデリゲートに続いて、デリゲート

protocol UserTableViewDelegate: class { 

    func helpClicked() 
} 

を作成します。UserTableViewDelegate?クラスUserTableViewController

@IBAction func helpButtonClicked(_ sender: UIButton) { 
delegate?.helpClicked() 
} 

私は、関数が呼び出されない飽きないしかし、その後、デリゲートUserTableViewDelegate

func helpClicked() { 
} 

に準拠しています。 HelpTableViewCellクラスのデリゲート変数は常にnilで、delegate?.helpClicked()は無効です。

+0

U Implemetedプロトコル? –

+0

デリゲートを設定した場所でデリゲートを設定していないので、呼び出されません –

+0

あなたのUserTableViewControllerでは、HelpTableViewCellデリゲートを= selfに設定しましたか? –

答えて

1

HelpTableViewCellクラスのデリゲート変数は常にnilで、デリゲート?.helpClicked()は無効です。

これは、デリゲートをまったく作成していないためです。デリゲートは、特定のデリゲートメソッドのセットを実装するオブジェクトです。少なくとも、あなたが示したコードでは、そのようなオブジェクトを作成していません。

私は、あなたがデリゲートプロトコルを定義したデリゲート

を作成します。あなたはそのプロトコルを採用するクラスをインスタンス化していません。あなたが参照しているチュートリアルは、それが使用する言語でかなりうっすらでなく、delegate protocol、つまり特定の種類のデリゲートが実装すると予想されるメソッドのセットと代理人それ自身それらのメソッドを委譲者に提供するオブジェクトです。

正しい考えだ私は、デリゲートUserTableViewDelegateに準拠して、

クラスUserTableViewControllerで

が、delegateがnilであるため、表現delegate?.helpClicked()が呼び出されない場合は、割り当てに失敗している必要がありますテーブルのデリゲートとしてのコントローラ。ビューコントローラをビューに接続するのと同じ方法で、デリゲートをストーリーボードに割り当てることができます。問題のテーブルがストーリーボードにすべてのセルが作成されているスタティックセルを使用する場合は、これを行うことができます。 HelpTableViewCellのdelegateをIBOutletにして、それをUserTableViewControllerに接続するだけです。ただし、表のセルは実行時に動的に構成されます。その場合、セルを設定するときにHelpTableViewCellのdelegateプロパティを設定する必要があります。これはおそらくtableView(_:cellForRowAt:)です。

あなたが説明した場合、委任を気にする必要はありません。ユーザーがセルとやりとりすると、テーブルビューのデリゲートが既に通知されます。あなたがiOSかMacOSで作業しているかどうかはここでは言いませんが、問題はありません:UITableViewDelegate(iOS)とNSTableViewDelegate(macOS)の両方に、セルがタップまたはクリックされたときに呼び出されるメソッドがあります。通常、セルはかなり軽量なオブジェクトです。通常は、コンテンツを適切に表示し、テーブルのデリゲート(ほとんどの場合はビューコントローラ)にユーザーのやりとりを任せています。

あなたはまた、以下のようにデリゲートプロパティを設定する必要が UserTableViewController以内
0

-

nameofyourCustomcellObject.delegate =自己