Делегат не будет выполнять функцию - PullRequest
1 голос
/ 25 мая 2019

У меня есть контроллер представления с представлением контейнера, который содержит статический UITableViewController в качестве меню.Родительский контроллер представления является частью UIPageViewController.

Всякий раз, когда пользователь щелкает строку, я хочу вызвать функцию для выполнения перехода из PageViewController.Для этого я добавил didSelectRowAt внутри MenuTableViewController.- Эта функция работает нормально, так как запросы на печать выполняются.

Чтобы вызвать функцию из 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)
    }

}

Редактировать: в viewDidLoad () PageViewController

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

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Вы создаете другой объект для menuVc и назначаете ему делегата, он отличается от 1 в раскадровке, поэтому внутри viewDidLoad из PagerVC

let home = //
let menu = home.children.first as! MenuTableViewController
menu.delegate = self
0 голосов
/ 25 мая 2019

Вот как вы должны использовать делегат :
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()
    }
}
...