2016-06-11 2 views
4

У меня есть тестовый проект, который я пытаюсь передать аргументу метода разрешения в проекте Swinject.Как передать аргументы методу разрешения при использовании Swinject?

Вот пример того, что у меня есть в файле расширения для раскадровки Swinject.

import Swinject 

extension SwinjectStoryboard { 

    class func setup() { 

     let mainDm = MainDM() 

     defaultContainer.register(MainDM.self) { _ in 
      mainDm 
     } 

     defaultContainer.registerForStoryboard(ViewController.self) { r, c in 
      c.dm = r.resolve(MainDM.self) 
      c.container = defaultContainer 

     } 


     defaultContainer.register(GetMessageAction.self) { _, delegate in 
      GetMessageAction(dm:mainDm, delegate: delegate) 
     } 

    } 

} 

в моем ViewController я пытаюсь сделать следующее, чтобы решить GetMessageAction

@IBOutlet weak var myText: UILabel! 

    var dm:MainDM! 
    var container:Container! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(3), target: self, selector: #selector(ViewController.getMessage), userInfo: nil, repeats: false) 

    } 

    func getMessage() { 

     let action:GetMessageAction? = container.resolve(GetMessageAction.self, argument: self)! 
     action?.execute() 

    } 

я получаю следующее сообщение, когда моя функция GetMessage работает

fatal error: unexpectedly found nil while unwrapping an Optional value

ответ

0

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

  • instantiateViewControllerWithIdentifier
  • instantiateInitialViewController

https://github.com/Swinject/Swinject/blob/v1/Documentation/Storyboard.md https://github.com/Swinject/SwinjectStoryboard/issues/5

+0

Это не объясняет, почему я не могу передать аргумент разрешению (GetMessageAction.self, аргумент: self) – mattwallace

+0

Прошу прощения за мое недоразумение. У меня не было времени внимательно прочитать ваш вопрос. –

+0

Я думаю, что вы инициализировали 'ViewController' своим инициализатором, а не' instantiateViewControllerWithIdentifier' или 'instantiateInitialViewController'. Вот почему свойство 'container'' ViewController' не было введено, и вы получили ошибку. Если вы используете какой-либо метод 'instantiate *', я думаю, что метод 'resolve' для' GetMessageAction' с аргументом должен работать, потому что свойство 'container' вводится, и это не' nil'. –

2

В решении с аргументами зависит от точности соответствия типов аргументов, необходимо обратное приведение переданный объект:

container.resolve(GetMessageAction.self, argument: self as GetMessageActionDelegate)! 

Предполагая, что GetMessageActionDelegate - это тип делегата, переданного в конструкторе GetMessageAction(dm:delegate:).

+0

Выполняя это, я все равно получаю следующую ошибку: Неустранимая ошибка: неожиданно найден nil при развертывании Необязательное значение – mattwallace

1

Стремительное файл из ViewController вы создали в раскадровке должен объявить Init (NSCoder), это на самом деле не упоминается в README.md, я думаю об открытии вопроса относительно этого ...

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

Вы можете взглянуть на мою open source project using exactly this technique, я настройка зависимостей с помощью extension of SwinjectStoryboard here, например, LoadingDataVC.

extension SwinjectStoryboard { 
    class func setup() { 

     defaultContainer.register(HTTPClientProtocol.self) { _ in 
      HTTPClient() 
     }.inObjectScope(.Container) 

     defaultContainer.register(APIClientProtocol.self) { r in 
      APIClient(
       httpClient: r.resolve(HTTPClientProtocol.self)! 
      ) 
     }.inObjectScope(.Container) 

     defaultContainer.register(ImagePrefetcherProtocol.self) { _ in 
      ImagePrefetcher() 
     }.inObjectScope(.Container) 

     defaultContainer.registerForStoryboard(GameVC.self) { r, c in 
      c.imagePrefetcher = r.resolve(ImagePrefetcherProtocol.self) 
     } 

     defaultContainer.registerForStoryboard(LoadingDataVC.self) { r, c in 
      c.apiClient = r.resolve(APIClientProtocol.self) 
      c.imagePrefetcher = r.resolve(ImagePrefetcherProtocol.self) 
     } 
    } 
} 

Как только у вас есть требуемый init, он должен работать! :)