ViewController не определен - PullRequest
0 голосов
/ 25 июня 2018

У меня есть FakeSplashController, который выполняет;

  1. ) Выполните сетевой запрос и дождитесь его результата
  2. ) Показать анимацию, затем откройте SeconViewController

Что-то блокирует этот ViewController для освобождения, и функция deinit не вызывается.

Кроме того, AppInitService имеет статическую функцию и вызывается внутри этого SplashController.Я также пытаюсь добавить [weak self] в сетевой запрос.Однако это также не решает проблему.

class SplashViewController: UIViewController {

let logoImage:  UIImageView = {
    let imageView = UIImageView()
    imageView.image = UIImage(named: "logo")
    imageView.contentMode = .scaleAspectFit

    return imageView
}()

let textLogo: UIImageView = {
    let imageView = UIImageView()
    imageView.image = UIImage(named: "text-logo")
    imageView.contentMode = .scaleAspectFit
    return imageView
}()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    setupUI()
    networkRequests()

}

func networkRequests(){

    AppInitService().initAppRequest { [](result) in
        switch result{
        case .success(_):
            self.startAnimation()
            return
        case .error(let error):
            UIControlUtil.showErrorMessage(title: error.title, message: error.message, closeButton: true)
            return
        }
    }
}

func openApp(){
    let loginController = WelcomeViewController()
    guard let window = UIApplication.shared.keyWindow else {
        return
    }
    window.rootViewController = loginController
}

func startAnimation(){
    UIView.animate(withDuration: 0.8, animations: {
        self.logoImage.frame.origin.x -= 100
    }, completion: nil)
    UIView.animate(withDuration: 1,delay: 0.3,animations: {
        self.textLogo.alpha = 1
        self.textLogo.frame.origin.x += 50
    }, completion: { _ in
        self.openApp()
    })
}

deinit {
    print("Splash Deinited")
}
func setupUI(){
    self.view.backgroundColor = Color.NavigationBar.tintColor
    logoImage.frame = CGRect(x: 0, y: 0, width: 80, height: 80)
    logoImage.center = self.view.center
    self.view.addSubview(logoImage)
    textLogo.frame = CGRect(x: 0,y: 0, width: 195, height: 80)
    textLogo.center = self.view.center
    textLogo.frame.origin.x -= 20
    self.view.addSubview(textLogo)
    textLogo.alpha = 0
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

Ответы [ 4 ]

0 голосов
/ 25 июня 2018

Без использования слабой ссылки функция не может освободить объект самообслуживания, поэтому эта функция генерирует моменты цикла сохранения. Вы можете использовать слабую ссылку.

// You can use weak reference certain to not capture self by updating it to...
func networkRequests(){
    AppInitService().initAppRequest { [weak self] result in
        guard let strongSelf = self else {
            return
        }
        switch result{
        case .success(_):
            strongSelf.startAnimation() // HERE BE DRAGONS!
            return
        case .error(let error):
            UIControlUtil.showErrorMessage(title: error.title, message: error.message, closeButton: true)
            return
        }
    }
}
0 голосов
/ 25 июня 2018

Проблема заключалась в том, что я создавал этот SplashController как глобальную и необязательную переменную внутри AppDelegate как;

var splashController: SplashController?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        splashController = SplashController()
        self.window?.rootViewController = splashController

        return true
    }

Я делаю его как:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        let splashController = SplasController()
        self.window?.rootViewController = splashController
        return true
    }
0 голосов
/ 25 июня 2018

Вы захватываете self в этом блоке ...

func networkRequests(){    
    AppInitService().initAppRequest { result in
        switch result{
        case .success(_):
            self.startAnimation() // HERE BE DRAGONS!
            return
        case .error(let error):
            UIControlUtil.showErrorMessage(title: error.title, message: error.message, closeButton: true)
            return
        }
    }
}

Это потенциальная причина утечки памяти.

Вы можете быть уверены, что не захватите себя, обновив его до ...

func networkRequests(){
    AppInitService().initAppRequest { [weak self] (result) in
        switch result{
        case .success(_):
            self?.startAnimation()
            return
        case .error(let error):
            UIControlUtil.showErrorMessage(title: error.title, message: error.message, closeButton: true)
            return
        }
    }
}
0 голосов
/ 25 июня 2018

Сначала вы можете получить все контроллеры представлений в массиве, а затем, проверив соответствующий класс контроллеров представлений, можете удалить тот, который вам нужен.

Вот небольшой фрагмент кода:

var navArray:Array = (self.navigationController?.viewControllers)!
navArray.removeAtIndex(0)
self.navigationController?.viewControllers = navArray

Думаю, это облегчит вашу работу.

...