【问题标题】:Delegate returns nil and not being called代表返回 nil 并且没有被调用
【发布时间】:2019-04-26 01:07:34
【问题描述】:

当单击button 时,我想要删除一个覆盖层,从而关闭ViewController。我已经调试过了,delegate 目前返回零。我不确定我在这里做错了什么。我错过了实施其他的东西吗?我什至尝试过打印语句,但什么都看不到。

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()
    }
}

delegate = (DismissOverlayDelegate?) nil

PlayersViewController 嵌入到 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
    }
}

【问题讨论】:

  • 您的实例playersViewController 不是屏幕上的实例,您需要在视图控制器堆栈中获取实际实例。您不能只使用PlayersViewController() 创建实例。
  • 您如何在代码中进一步使用playersViewController
  • 它只是一个帮助viewController,我想在按下按钮时摆脱它。从superView中删除它
  • 您是如何添加playersViewController 的?向我们展示该代码。
  • 它嵌入在UIPageViewController

标签: ios swift delegates overlay delegation


【解决方案1】:

如果您正在使用或想要使用委托进行调用或实现一些有根的东西,让我向您解释一下,您必须以正确的方式做到这一点。你做得很好没问题,但是委托的实现不正确,你的方法不能接受,所以试试这个:-

您的主视图控制器

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);
    }
}

这是你的游乐场 VC

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)
    }

}

现在希望你明白你必须做什么......!

【讨论】:

  • 这看起来不错,但我应该在哪里使用@IBAction func go(_ sender: UIButton) {}。我理解实例化它,但我在 HomeViewController 中没有按钮 go 按钮
  • 是的,我通过将嵌入 vcs 的代码添加到 UIPageViewController
  • 你能解释清楚你想要什么
  • 我有一个UIBarbuttonItem,它将这些viewControllers 显示为覆盖中的帮助页面。我在最后一个viewController 上有一个button,我想点击它以将其删除覆盖层,从而将其从superview 中删除
  • 有很多方法可以删除,比如你可以使用 .isHidden、stackView 和隐藏它,或者设置该视图的高度约束 0 那么为什么选择这种硬方法?
【解决方案2】:

看来 PlayersViewController() 是错误的。 使用 StoryBoard 时应使用 instantiateInitialViewController() 或 instantiateInitialViewController()。

https://developer.apple.com/documentation/uikit/uistoryboard/1616214-instantiateviewcontroller

https://developer.apple.com/documentation/uikit/uistoryboard/1616213-instantiateinitialviewcontroller

【讨论】:

  • 这可行,但它只是在顶部显示HomeViewCotroller,这是我不知道的。我只想按下按钮让overlay 消失而不显示另一个viewController
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 2021-03-11
  • 1970-01-01
  • 2021-03-17
  • 2022-06-30
  • 2019-08-29
相关资源
最近更新 更多