自定义UITableViewCell中弹出UIAlertController的实现方法

问题

class DeviceTableViewCell: UITableViewCell {
    @IBOutlet weak var editNameButton: UIButton!
    @IBAction func editNameBtnClicked(sender: AnyObject) {
        ...
        // 这里编译不通过: 'DeviceTableViewCell' does not have a member named 'presentViewController'
       self.presentViewController(alertController, animated: true, completion: nil)
        ...
    }

}

原因是因为presentViewController是UIViewController的方法, 而不是UITableViewCell的方法.

解决方法

1.在上一个 tableViewController 中,设置 cell 的时候为 cell 中的 button 通过代码增加事件: addTarget

class DevicesListTableViewController: UITableViewController {
    ...
// 设置每行的内容
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("device", forIndexPath: indexPath) as! DeviceTableViewCell        
        cell.nameLabel.text = deviceArray[indexPath.row].name
        cell.device = deviceArray[indexPath.row]
        // 传递 indexpath        
        cell.editNameButton.tag = indexPath.row
        cell.editNameButton.addTarget(self, action: "editName:", forControlEvents: UIControlEvents.TouchUpInside)
        return cell
    }
    ...
}

2.然后在指定的 editName 中实现弹出

    func editName(sender: UIButton!) {
        ...
        // 这里把上面点击的哪个 cell 的 index放到 button的 tag中带过来
        let selectedDevice = deviceArray[sender.tag]
        // 省略 alertController 的设置
        self.presentViewController(alertController, animated: true, completion: nil)
    }
2015-07-08 18:5639