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,那么为什么选择这种硬方法呢?