TableViewCell中的presentViewController

问题描述 投票:3回答:4

我有一个TableViewController,TableViewCell和一个ViewController。我在TableViewCell中有一个按钮,我想用presentViewController呈现ViewController(但ViewController在故事板上没有视图)。我尝试使用:

@IBAction func playVideo(sender: AnyObject) {
        let vc = ViewController()
        self.presentViewController(vc, animated: true, completion: nil)
}

错误:TableViewCell类型的值没有成员presentViewController


然后,我尝试了

self.window?.rootViewController!.presentViewController(vc, animated: true, completion: nil)

错误:警告:尝试显示其视图不在窗口层次结构中!


我在做什么错?为了从TableViewCell呈现PresentController,我应该怎么做?另外,如何将数据从TableViewCell传递到新呈现的VC?


更新:

protocol TableViewCellDelegate
{
   buttonDidClicked(result: Int)
}

class TableViewCell: UITableViewCell {

    @IBAction func play(sender: AnyObject) {
        if let id = self.item?["id"].int {
            self.delegate?.buttonDidClicked(id)
        }
    }
}
----------------------------------------

// in TableViewController

var delegate: TableViewCellDelegate?
func buttonDidClicked(result: Int) {
    let vc = ViewController()
    self.presentViewController(vc, animated: true, completion: nil)
}

我收到错误:不建议在分离的视图控制器上显示视图控制器

((请注意,TableView后面有一个NavBar和TabBar链。)


我也尝试过

 self.parentViewController!.presentViewController(vc, animated: true, completion: nil)

相同错误。


也尝试过,

self.view.window?.rootViewController?.presentViewController(vc, animated: true, completion: nil)

相同错误

ios swift uitableview tableview tableviewcell
4个回答
8
投票

您应该使用protocol将操作传回tableViewController

1)在您的单元格类别中创建一个protocol

2)使button操作调用您的protocol函数

3)用cell's protocol链接tableViewController中的[C0

4)实现cell.delegate = self并在其中添加代码

cell's protocol

8
投票

似乎您已经知道要提供一个视图控制器,您需要一个视图控制器。所以这是您需要做的:

  1. 创建一个协议,该协议将通知单元控制器该按钮被按下。
  2. 在单元格中创建一个属性,该属性包含对实现协议的委托的引用。
  3. 在按钮动作内在您的委托上调用协议方法。
  4. 在视图控制器中实现协议方法。
  5. [配置单元时,将视图控制器作为委托传递到单元。

这里是一些代码:

let vc = ViewController()
self.presentViewController(vc, animated: true, completion: nil)

0
投票

因此self.presentViewController是ViewController中的方法。您收到此错误的原因是因为您引用的“自我”是tableViewCell。而且tableViewCell没有presentViewController的方法。

我认为您可以使用一些选项:1.在单元格中添加一个委托和协议,当您单击按钮时,IBAction将调用

// 1.
protocol PlayVideoCellProtocol {
    func playVideoButtonDidSelect()
}

class TableViewCell {
// ...

// 2.
var delegate: PlayVideoCellProtocol!

// 3.
@IBAction func playVideo(sender: AnyObject) {
    self.delegate.playVideoButtonDidSelect()
}

// ...
}


class TableViewController: SuperClass, PlayVideoCellProtocol {

// ...

    // 4.
    func playVideoButtonDidSelect() {
        let viewController = ViewController() // Or however you want to create it.
        self.presentViewController(viewController, animated: true, completion: nil)
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath: NSIndexPath) -> UITableViewCell {
        //... Your cell configuration

        // 5.
        cell.delegate = self

        //...
    }
//...
}

然后在tableVC中,您只需要实现此方法并调用self.presentViewController

2。使用情节提要和剧情在情节提要中,将按钮从按钮拖到您要使用的VC。


0
投票

我也遇到了同样的问题,并在堆栈中的某个地方找到了此代码,但我不记得在哪里了,所以它不是我的代码,但我在这里没有介绍。这是我要在任何地方显示视图控制器时使用的功能,它说明了keyWindow已禁用,但效果很好

self.delegate?.didClickButton()

您在任何情况下都使用它,就我而言,我使用过:

    extension UIApplication
{

    class func topViewController(_ base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController?
    {
        if let nav = base as? UINavigationController
        {
            let top = topViewController(nav.visibleViewController)
            return top
        }

        if let tab = base as? UITabBarController
        {
            if let selected = tab.selectedViewController
            {
                let top = topViewController(selected)
                return top
            }
        }

        if let presented = base?.presentedViewController
        {
            let top = topViewController(presented)
            return top
        }
        return base
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.