Внедрение зависимостей в UIViewControllers iOS swift - PullRequest
0 голосов
/ 14 ноября 2018

Сначала я проверил этот пост , и это было бесполезно

Я хочу применить внедрение зависимостей при переходе от контроллера к другому,

скажем, у меня естьконтроллер A:

import UIKit

class A: UIViewController {

}

и контроллер B:

import UIKit

class B: UIViewController {

       var name : String!

}

Я перемещаюсь от A к B следующим образом:

let bViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "BVC")
as! B
bViewController.name = "HelloWorld"
self.navigationController?.pushViewController(bViewController, animated: true)

Я хочупреобразовать мой код, чтобы использовать внедрение зависимостей через инициализаторы.

может любой совет, если это можно сделать, и если можно сделать, как ??

Спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019
class UserCredentials {

private let userDefaults: NSUserDefaults

private let authorizationTokenKey = "AuthorizationTokenKey"

init(userDefaults: NSUserDefaults) {
    self.userDefaults = userDefaults
}

func getAuthorizationToken() -> String {
    let value = userDefaults.stringForKey(authorizationTokenKey)
    guard let retVal = value else { return "" }
    return retVal
}
}
0 голосов
/ 14 ноября 2018

Это невозможно, так как вы используете раскадровки. Когда вы создаете экземпляр ViewController из Storyboard с помощью метода instantiateViewController, он использует required init?(coder aDecoder: NSCoder) initializer.

Если вы хотите использовать свой собственный инициализатор, вам нужно избавиться от раскадровки и создавать UIViewController только из кода или из xib файла. Таким образом, вы сможете сделать это:

import UIKit

class B: UIViewController {
    var name: String!

    init(name: String) {
        self.name = name
        super.init(nibName: nil, bundle: nil) # or NIB name here if you'll use xib file
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

Также вам необходимо указать init(coder...), поскольку каждый элемент пользовательского интерфейса может быть создан из Storyboard. Но вы можете оставить его с вызовом по умолчанию super, поскольку вы не будете его использовать.

Другой вариант - использовать метод static в ViewController из сообщения в начале вашего вопроса. Но на самом деле он также назначает переменные после инициализации ViewController.

Так что пока нет DI через инициализаторы. Я бы предложил использовать отдельный struct для всех данных, которые нужно ввести в VC. Эта структура будет иметь все необходимые поля, поэтому вы не пропустите ни одного из них. И ваш типичный поток будет:

  1. Создание VC из раскадровки
  2. Instantiate Data struct
  3. Назначить данные для ВК var data: Data!
  4. Использовать все введенные переменные из него
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...