2016-10-12 2 views
1

Я пытаюсь реализовать способ делегирования для выполнения некоторых действий при нажатии кнопки с моего UITableViewCell на ViewController. Ниже то, что я до сих пор -Button Действие от UITableViewCell to 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") 
    } 
} 

проблема здесь есть функция disableUser в моем ViewController никогда не вызывается. Что я делаю не так?

Каков наилучший способ сделать это?

Я ссылался на SO Approved Answer Here, который является тем, за чем я следую тому же, но не повезло. Любая помощь будет оценена по достоинству. Благодаря!!

+1

выглядит так, как ваш делегат равен нулю в vieDidLoad. Вы должны установить delagate в методе cellForRow –

+0

Вы не можете инициализировать экземпляр 'UITableViewCell' с инициализатором по умолчанию'() '. Вы должны вызвать назначенный инициализатор 'init (style: reuseIdentifier:)'. В Swift удобнее использовать закрытие обратного вызова, а не шаблон делегата. – vadian

+0

@TejaNandamuri: Это сделал трюк!Я упустил из виду тот факт, что это tableViewCell :-( –

ответ

0

Вы должны установить delegate вашей ячейки в method.As @vadian сказал cellForRowAtIndexPath, В viewDidLoad вы не должны инициализировать ячейку, используя по умолчанию инициализатор, и делегат ноль для ячейки по этому пути в viewDidLoad.

Либо инициализируйте свою ячейку, используя init (style: reuseIdentifier), либо установите делегат в ячейке для метода row, поскольку вы все равно инициализируете ячейку в этом методе.

0

Когда вы делаете это:

let userCell = UserCell() 
userCell.delegate = self 

Вы устанавливаете делегата от userCell и только делегат userCell. Я уверен, что ячейки таблицы, отображаемые в вашем представлении таблицы, равны неuserCell.

Таким образом, вместо того, чтобы назначать делегат userCell, вы должны установить делегат ячеек, который вы действительно хотите отобразить в виде таблицы. Наиболее вероятным местом для создания новых ячеек, которое вы хотите показать в виде таблицы, является метод tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath).

В методе, вы должны иметь что-то вроде этого:

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

Вам просто нужно добавить эту строку перед возвращением:

cell.delegate = self 
0

В коде UserCell действует подобно UIView. Вы забыли добавить userCell в текущий вид контроллера. Если вы хотите использовать UITableViewCell, лучший способ - использовать его с UITableView.

Смежные вопросы