在Swift中从TableViewCell类切换视图控制器

时间:2018-11-19 01:06:46

标签: ios swift presentviewcontroller

当用户单击tableviewcell中的元素时,我想展示一个新的ViewController。但是,用于启动VC的标准代码不适用于Tableview单元,甚至无法在助手类中使用,因为TVC和助手类都不能提供视图控制器。

这是帮助程序类中的代码。无论放置在helperclass还是tableview单元中,它都没有启动VC的当前方法。

class launchVC {
 func launchVCNamed(identifier: String) {
    let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let secondVC = storyBoard.instantiateViewController(withIdentifier: "contactDetail")
//FOLLOWING LINE HAS ERROR NO SUCH MEMBER (present)
    self.present(secondVC, animated: true, completion: nil)
    }
 }

如何修改它以启动VC?

2 个答案:

答案 0 :(得分:3)

通常,您应该使用委托模式或闭包将块从单元格传递回视图控制器。我更喜欢使用闭包代替委托,所以我举一个这样的例子:

class SomeCell: UITableViewCell {
    var actionBlock = { }

    func someActionOccured() { // some action like button tap in cell occured
        actionBlock()
    }
}

在视图控制器的cellForRow中,您需要分配闭包

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! SomeCell // replace cell identifier with whatever your identifier is
    cell.actionBlock = { [unowned self] in 
        let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let secondVC = storyBoard.instantiateViewController(withIdentifier: "contactDetail")
        self.present(secondVC, animated: true, completion: nil)
    }
    return cell
}

答案 1 :(得分:1)

将委托添加到您的单元,并将其分配给presentingVC。见下文。

使用委托

创建从UITableViewCell继承的CustomCell。

class CustomCell: UITableViewCell {
    var cellDelegate : CustomCellDelegate = nil

    @IBAction func elementTapped() {
        cellDelegate?.launchVC()
    }
}

自定义单元委托

protocol CustomCellDelegate {
    func launchVC()
}

MainViewController

class ViewController: UIViewController, UITableViewControllerDataSource, UITableViewDelegate {

    IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        tableView.dataSource = self
        tableView.delegate = self
    }

    func numberOfSections(in: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? CustomCell {

            // important
            cell.delegate = self
            return cell
        }
    }
}

扩展ViewController以实现协议

extension ViewContrller: CustomCellDelegate {
    func launchVC() {
        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "SecondViewController")
        self.present(vc, animated: true, completion: nil)
    }
}