【问题标题】:Delegate won't execute function委托不会执行功能
【发布时间】:2019-05-25 17:47:24
【问题描述】:

我有一个带有容器视图的视图控制器,其中包含一个静态 UITableViewController 作为菜单。父视图控制器是UIPageViewController 的一部分。

每当用户单击一行时,我都想调用一个函数来从 PageViewController 执行 segue。为此,我在MenuTableViewController 中添加了didSelectRowAt。 - 此功能工作正常,因为正在执行打印请求。

为了从 PageViewController 调用一个函数,我尝试使用委托,但不知何故该函数不会被执行。

  • RootPageViewController:
override func viewDidLoad() {
        super.viewDidLoad()
        self.dataSource = self

        let vc = storyboard?.instantiateViewController(withIdentifier: "menuView") as! MenuTableViewController
        vc.delegate = self
        ...

}

func goToMap() {
        performSegue(withIdentifier: "goMap", sender: self)
}
  • MenuTableViewController:
class MenuTableViewController: UITableViewController {

    let defaults = UserDefaults.standard

    weak var delegate: RootPageViewController?
}

extension MenuTableViewController {

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print(indexPath.row)

        if indexPath.row == 2 {
            delegate?.goToMap()
        }

        tableView.deselectRow(at: indexPath, animated: true)
    }

}

编辑:在 PageViewController 的 viewDidLoad() 中

let home = storyboard?.instantiateViewController(withIdentifier: "homeView") as! HomeViewController
home.loadViewIfNeeded()
let menu = home.children[1] as! MenuTableViewController
print("Children:", home.children)
menu.delegate = self
class RootPageViewController: UIPageViewController, UIPageViewControllerDataSource, UIScrollViewDelegate, UIViewControllerTransitioningDelegate {

    lazy var viewControllerList:[UIViewController] = {

            let sb = UIStoryboard(name: "Main", bundle: nil)

            let vc1 = sb.instantiateViewController(withIdentifier: "homeView")
            let vc2 = sb.instantiateViewController(withIdentifier: "timelineView")

            return [vc1, vc2]

    }()

    let defaults = UserDefaults.standard
    let transition = CircularTransition()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.dataSource = self

        let home = storyboard?.instantiateViewController(withIdentifier: "homeView") as! HomeViewController
        home.delegate = self
        print(home.delegate)

        if let secondViewController = viewControllerList.first as? HomeViewController {
            self.setViewControllers([secondViewController], direction: .forward, animated: true, completion: nil)
....

【问题讨论】:

    标签: ios swift delegates pager


    【解决方案1】:

    您为 menuVc 创建另一个对象并将委托分配给它,它与故事板中的 1 不同,所以在 PagerVC 的 viewDidLoad 内部

    let home = //
    let menu = home.children.first as! MenuTableViewController
    menu.delegate = self
    

    【讨论】:

    • 您的意思是在 RootPageViewController 中显示 MenuTableController 吗? MenuTableController 始终作为 HomeViewController 的容器显示在其父级内部,只是不在屏幕中。一旦用户点击一个汉堡包,它就会滑入。
    • 如何将菜单作为容器添加到 home 显示代码?还是你在 IB 里面做?
    • 我用情节提要向 HomeViewController 添加了一个 ContainerView - 在这个容器中我嵌入了一个 UITableViewController,它是 MenuTableController。此外,我将 @IBOutlet weak var menuView: UIView! 添加到 HomeViewController - 但我从未使用过它。
    • 您为 menuVc 创建另一个对象并将委托分配给它,它与情节提要中的 1 不同 ,,,, 尝试编辑,我假设 homevc 是在代码中手动添加到寻呼机的,因此提取来自它的真实菜单对象,即呈现的 1 并将委托分配给它,您当前的代码应该将委托打印为 nil,原因是我在答案中添加了上述原因
    • 当我尝试打印 home.children 时,它返回一个空数组,但是当我稍后在代码中调用它时 - 有孩子被返回。好像PageViewController加载的时候,children还没有。
    【解决方案2】:

    这就是您应该如何使用 delegate
    MenuTableViewController

    protocol MenuTableViewControllerDelegate: class {
        func menuTableViewController(menuTableViewController: MenuTableViewController, shouldGoToMap: Bool)
    }
    
    class MenuTableViewController: UITableViewController {
    
        let defaults = UserDefaults.standard
    
        weak var delegate: MenuTableViewControllerDelegate?
    
        ...
    }
    
    extension MenuTableViewController {
    
        override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            print(indexPath.row)
    
            if indexPath.row == 2 {
                delegate?.menuTableViewController(menuTableViewController: self, shouldGoToMap: true)
            }
    
            tableView.deselectRow(at: indexPath, animated: true)
        }
    
    }
    

    RootPageViewController

    class RootPageViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.dataSource = self
    
            let vc = storyboard?.instantiateViewController(withIdentifier: "menuView") as! MenuTableViewController
            vc.delegate = self
    
        }
    
        func goToMap() {
            performSegue(withIdentifier: "goMap", sender: self)
        }
    }
    
    extension RootPageViewController: MenuTableViewControllerDelegate {
        func menuTableViewController(menuTableViewController: MenuTableViewController, shouldGoToMap: Bool) {
            goToMap()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-17
      • 1970-01-01
      • 2018-09-04
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多