自定义tableViewCell中的 button 跳转实现

目标

在自定义的 tableViewCell 中有一个 button, 点击后跳转到另外一个 ViewController, 需要传递参数到新的 VC, 同时为了在跳转到新的 VC 上有navigationBar,segue 的类型要是 push, 而不是 modal.

首先,尝试在UITableViewCell 中直接定义 button 的事件,但发现不能使用prepareForSegue,原因与上一篇<自定义UITableViewCell中弹出UIAlertController的实现方法>碰到的问题一样,于是

class DevicesListTableViewController: UITableViewController {
...
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("device", forIndexPath: indexPath) as! DeviceTableViewCell
       //设置定时按钮动作
        cell.alarmButton.tag = indexPath.row
        cell.alarmButton.addTarget(self, action: "setAlarm:", forControlEvents: UIControlEvents.TouchUpInside)
        return cell
    }
...
    func setAlarm(sender: UIButton!) {
        let selectedDevice = deviceArray[sender.tag]
        UIUtils.forward(self, toViewControllerIdentifier: "alarmViewController", completion: nil)
    }
}

这里的UIUtils.forward 是一个工具类, 使用presentViewController直接跳转

// 页面跳转
    class func forward(currentViewController: UIViewController,toViewControllerIdentifier: String, completion: (() -> Void)?) -> Void {
        var sb = UIStoryboard(name: "Main", bundle:nil)
        var vc = sb.instantiateViewControllerWithIdentifier(toViewControllerIdentifier) as! UIViewController

        currentViewController.presentViewController(vc, animated: true, completion: completion)
        return
    }

这样可以实现跳转, 但是有两个问题:

  • 跳转过去的 VC 没有 navigationBar
  • 无法传递参数过去, 不知道是哪个 tableViewCell 的 button 点过去的

解决

先在 tableViewController 到 新的 VC 新建一个 segue, 类型为 push, 注意这里是 VC 到 VC 的 segue, 而不是按钮到 VC
相关的3个函数:

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("device", forIndexPath: indexPath) as! DeviceTableViewCell
        //设置定时按钮动作
        cell.alarmButton.tag = indexPath.row
        cell.alarmButton.addTarget(self, action: "setAlarm:", forControlEvents: UIControlEvents.TouchUpInside)
        return cell
    }

    // 页面跳转前的赋值
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let selectedDevice = sender as? Device {
            if segue.identifier == "toAlarmViewSegue" {
                if let destiViewController = segue.destinationViewController as? AlarmViewController {
                    destiViewController.device = selectedDevice
                }
            }
        }
    }

    // 设置定时按钮的动作
    func setAlarm(sender: UIButton!) {
        let selectedDevice = deviceArray[sender.tag]
        performSegueWithIdentifier("toAlarmViewSegue", sender: selectedDevice)

    }
2015-07-09 16:1899