Свифт: Делегат ноль - PullRequest
       5

Свифт: Делегат ноль

0 голосов
/ 29 сентября 2018

Я пытаюсь создать AppCoordinator, который содержит в моем приложении ViewControllers:

class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    window = UIWindow(frame: UIScreen.main.bounds)

    let appCoordinator = AppCoordinator()
    window?.rootViewController = appCoordinator.initialTabBarController()
    window?.makeKeyAndVisible()
    return true
}
// ...


import SnapKit

class AppCoordinator {

    private let initialTabController = TabBarController()
    private let cars = CarProvider.sharedInstance.getCars()

    init() {
        var viewControllers = [ViewController]()
        viewControllers.append(carListViewController())

        initialTabController.setViewControllers(viewControllers, animated: true)
    }

    private func carListViewController() -> CarListViewController {
        let controller = CarListViewController(cars: cars)
        print(self)
        controller.delegate = self
        return controller
    }
}

// MARK: - CarListViewControlerDelegate
extension AppCoordinator: CarListViewControlerDelegate {
    func didPullToRefresh() {
        print("Did pull")
    }
}

Мой CarListViewController выглядит следующим образом:

import UIKit

protocol CarListViewControlerDelegate: class {
    func didPullToRefresh()
}

class CarListViewController: ViewController {

    weak var delegate: CarListViewControlerDelegate?

    // MARK: Interface Properties
    private let tableView = TableView()
    private let refreshControl = UIRefreshControl()

    private var cars: [Car]?

    // MARK: Initializers
    init(cars: [Car]) {
        super.init(nibName: nil, bundle: nil)
        self.cars = cars
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

// MARK: - Actions
extension CarListViewController {

    @objc private func refresh() {
        delegate?.didPullToRefresh()
        refreshControl.endRefreshing()
    }
}

Мой метод обновления вызывается, когда я пытаюсь обновить данные в UITableView, а метод протокола didPullToRefresh - нет.Когда я проверяю делегата, его значение равно nil.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Как сказал Ш_Хан, вам нужна сильная ссылка.Вам следует изменить способ установки делегата для созданного CarListViewController.

Я изменил ваш код, как показано ниже.дайте мне знать, если проблема решена.

class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    window = UIWindow(frame: UIScreen.main.bounds)

    let appCoordinator = AppCoordinator()
    window?.rootViewController = appCoordinator.initialTabBarController()
    window?.makeKeyAndVisible()
    return true
}
// ...


import SnapKit

class AppCoordinator {

    private let initialTabController = TabBarController()
    private let cars = CarProvider.sharedInstance.getCars()
    var controller = CarListViewController!

    init() {
        var viewControllers = [ViewController]()
        let carListVC = CarListViewController(cars: cars)

        self.controller = carListVC
        self.controller.delegate = self

        viewControllers.append(self.controller)

        initialTabController.setViewControllers(viewControllers, animated: true)
    }
}

// MARK: - CarListViewControlerDelegate
extension AppCoordinator: CarListViewControlerDelegate {
    func didPullToRefresh() {
        print("Did pull")
    }
}
0 голосов
/ 29 сентября 2018

Вам нужна сильная ссылка, поэтому сделайте ее экземпляром var внутри AppDelegate

let appCoordinator = AppCoordinator()

ИЛИ

var appCoordinator:AppCoordinator! 

self.appCoordinator = AppCoordinator()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...