Ios 委托返回nil且未被调用

Ios 委托返回nil且未被调用,ios,swift,delegates,overlay,delegation,Ios,Swift,Delegates,Overlay,Delegation,当单击按钮时,我想删除一个覆盖,从而解除视图控制器。我已调试,委托当前返回nil。我不确定我做错了什么。我是否错过了执行其他任务?我甚至试过打印报表,但什么都看不到 protocol DismissOverlayDelegate: class { func dismissOverlay(_ sender: PlayersViewController) } class PlayersViewController: UIViewController { weak var dele

当单击
按钮
时,我想删除一个覆盖,从而解除
视图控制器
。我已调试,
委托
当前返回nil。我不确定我做错了什么。我是否错过了执行其他任务?我甚至试过打印报表,但什么都看不到

protocol DismissOverlayDelegate: class {
    func dismissOverlay(_ sender: PlayersViewController)
}

class PlayersViewController: UIViewController {

    weak var delegate: DismissOverlayDelegate?

    @IBAction func getStartedTapped(_ sender: UIButton) {
        self.delegate?.dismissOverlay(self)
    }
}
在我的
ViewController
中,我实现了
delegate
方法

class HomeViewController: UIViewController, DismissOverlayDelegate {

    @IBOutlet weak var customOverlay: CustomOverlayView!

    let playersViewController = PlayersViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.playersViewController.delegate = self
    }

    func dismissOverlay(_ sender: PlayersViewController) {
        self.customOverlay.removeFromView()
    }
}
委派=(DismissOverlayDelegate?)无

PlayerViewController嵌入到UIPageViewController中

class HomeViewController: UIPageViewController, UIPageViewControllerDataSource {

    var pages = [UIViewController]()

    override func viewDidLoad() {
        super.viewDidLoad()
        for storyboardIDs in ["playersVC1","playersVC2"] {
            let viewController = self.storyboard?.instantiateViewController(withIdentifier: storyboardIDs)
            self.pages.append(viewController!)
        }
        self.dataSource = self
        self.setViewControllers([self.pages.first!], direction: .forward, animated: true)
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        let currentIndex = self.pages.firstIndex(of: viewController)!
        if currentIndex > 0 {
            return self.pages[currentIndex - 1]
        }
        return nil
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        let currentIndex = self.pages.firstIndex(of: viewController)!
        if currentIndex < (self.pages.count - 1) {
            return self.pages[currentIndex + 1]
        }
        return nil
    }
}
类HomeViewController:UIPageViewController、UIPageViewController数据源{
变量页=[UIViewController]()
重写func viewDidLoad(){
super.viewDidLoad()
对于[“playersVC1”、“playersVC2”]中的情节提要ID{
让viewController=self.storyboard?.instanceeviewcontroller(带标识符:storyboardIDs)
self.pages.append(viewController!)
}
self.dataSource=self
self.setViewController([self.pages.first!],方向:。前进,动画:true)
}
func pageViewController(uPageViewController:UIPageViewController,viewController在viewController:UIViewController之前)->UIViewController{
让currentIndex=self.pages.firstIndex(of:viewController)!
如果currentIndex>0{
返回self.pages[当前索引-1]
}
归零
}
func pageViewController(pageViewController:UIPageViewController,viewController后的viewController:UIViewController)->UIViewController{
让currentIndex=self.pages.firstIndex(of:viewController)!
如果当前索引<(self.pages.count-1){
返回self.pages[currentIndex+1]
}
归零
}
}

看来PlayerViewController()是错误的。 在使用情节提要时,应使用InstanceInitialViewController()或InstanceInitialViewController()


让我来解释一下,如果您正在使用或想要使用委托进行调用,或者实现某个有根的东西,那么您必须以正确的方式实现它。您做得很好,没有问题,但委托的实现不正确。您的方法无法接受这一点,因此请尝试以下方法:-

主视图控制器

class HomeViewController: UIViewController, DismissOverlayDelegate {

    @IBOutlet weak var customOverlay: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func dismissOverlay(_ sender: PlayersViewController) {
        self.customOverlay.removeFromSuperview()
    }

    @IBAction func go(_ sender: UIButton) {
        let vc = self.storyboard?.instantiateViewController(withIdentifier: "PlayersViewController") as! PlayersViewController
        vc.delegate = self
        self.navigationController?.pushViewController(vc, animated: true);
    }
}
这是你的操场

protocol DismissOverlayDelegate: class {
    func dismissOverlay(_ sender: PlayersViewController)
}

class PlayersViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    weak var delegate: DismissOverlayDelegate?

    @IBAction func getStartedTapped(_ sender: UIButton) {
        self.delegate?.dismissOverlay(self)
    }

}

现在希望你明白你要做什么

您的实例
playerViewController
不是屏幕上的实例,您需要在视图控制器堆栈中获得实际实例。您不能只使用
PlayersViewController()
创建一个实例。您如何在代码中进一步使用
PlayersViewController
呢?当按下按钮时,它只是一个帮助
viewController
。从
superView
如何添加
playerViewController
中删除它?向我们显示该代码。它嵌入在
UIPageViewController
中。这可以工作,但它只是在顶部显示
HomeViewCotroller
,这是我不知道的。我只想按下按钮,使覆盖层消失,而不显示另一个视图控制器。这看起来很好,但是我应该在哪里使用
@IBAction函数(uu.sender:ui按钮){}
。我理解如何实例化它,但我在
HomeViewController
中没有“go”按钮是的,我添加了将vcs嵌入
UIPageViewController
的代码。你能准确地解释一下你想要什么吗我有一个
UIBarButtonim
,它将这些
ViewController
显示为覆盖图中的帮助页面。我在最后一个
视图控制器上有一个
按钮
,我想点击该按钮将其删除覆盖,从而将其从
超级视图中删除
有很多方法可以使用。isHidden、stackView和hide,或者将该视图的高度约束设置为0,那么为什么选择这种硬方法呢?