2016-10-12 5 views
1

私は、私のUITableViewCellからViewControllerへのボタンタップでいくつかのアクションを行うためにDelegateの方法を実装しようとしています。以下は、私がこれまで持っているものである -ボタン操作UITableViewCellからViewControllerへ

TableViewCell:

protocol UserCellDelegate : class { 
    func disableUser(cell: UserCell, button: UIButton) 
} 

class UserCell : UITableViewCell { 

    @IBOutlet weak var userLabel: UILabel! 
    @IBOutlet weak var userDescription: UILabel! 

    @IBOutlet weak var writeOutUser: UIButton! 

    weak var delegate: UserCellDelegate? 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     writeOutUser.layer.cornerRadius = 5.0 
    } 


    @IBAction func disableUserButtonAction(sender: UIButton) { 
     delegate?.disableUser(self, button: writeOutUser) //self here I believe to be the cell 
    } 


} 

のViewController:

class UserDetailTableViewController : UIViewController, UserCellDelegate { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     let userCell = UserCell() 
     userCell.delegate = self 
    } 

    func disableUser(cell: UserCell, button: UIButton) { 
     print("VC: User Disabled") 
    } 
} 

ここでの問題は、私のViewControllerでdisableUser関数が呼び出されることは決してありません、されています。私は間違って何をしていますか?

どのような方法が最適ですか?

私はSO Approved Answer Hereを参照していましたが、それは私が同じことに従っているものですが、運がありません。 助けていただければ幸いです。ありがとう!!

+1

あなたのデリゲートはvieDidLoadではnilのようです。 cellForRowメソッドでdelagateを設定する必要があります –

+0

デフォルトの初期化子 '()'で 'UITableViewCell'のインスタンスを初期化することはできません。指定された初期化子 'init(style:reuseIdentifier:)'を呼び出さなければなりません。 Swiftでは、デリゲートパターンではなくコールバッククロージャを使用する方が便利です。 – vadian

+0

@TejaNandamuri:それはトリックでした!私はそれがtableViewCellの事実を見落とした: –

答えて

0

は、あなたは、デフォルトの初期化子を使用して、細胞を初期化してはならないのviewDidLoadで、言っ@vadian cellForRowAtIndexPath method.Asであなたのセルのdelegateを設定する必要があり、デリゲートはviewDidLoadでこの方法によって、あなたの携帯用nilです。

init(style:reuseIdentifier)を使用してセルを初期化するか、行メソッドのセルでデリゲートを設定します。その方法でセルを初期化するようにします。

0

あなたはこれをやっているときは:

let userCell = UserCell() 
userCell.delegate = self 

あなたはuserCellのデリゲートを設定し、userCellだけデリゲートされています。テーブルビューに表示されているテーブルビューのセルがではなく、userCellであることを確認します。

代理人をuserCellに設定する代わりに、実際にテーブルビューに表示するセルの代理人を設定する必要があります。テーブルビューで表示する新しいセルを作成する最も可能性の高い場所は、tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)メソッドです。この方法で

、あなたはこのような何か持っている必要があります:あなたのコードではUIViewようUserCell行為を

cell.delegate = self 
0

:あなたはリターンする前にこの行を追加する必要があり

let cell = ... 
// setting properties of cell using the model 
return cell 

を。現在のコントローラのビューにuserCellを追加するのを忘れてしまった。 UITableViewCellを使用したい場合は、UITableViewでより良い方法を使用します。

関連する問題