2015-07-21 3 views
0

Я застрял на этом в течение последних нескольких дней -«неожиданно нашел ноль» - делегировать задания в subVC

graphView мой экземпляр класса UI - Я объявляю свой протокол CalculatorViewDataSource вне GraphView класса, которые содержат weak var calcDataSource: CalculatorViewDataSource? в этом.

в моем GraphViewController, в didSet {} выпускного graphView Я пытаюсь установить делегат на то, что я предполагаю, что это существующий CalculatorViewController, используя следующий код:

if let vc = splitViewController?.viewControllers { 
      println(vc) 
      println(vc.count) 
      if let fst = vc.first { 
       println(fst.subviews) 
       println(fst.subviews.first) 
      } 
     } 
graphView.calcDataSource = splitViewController!.viewControllers.first!.subviews.first as CalculatorViewController 

код компилируется, но я врезаться с "неожиданно нашел ноль", когда я добираюсь до присвоения graphView.calcDataSource

(выход)

[<UINavigationController: 0x7b71bd10>] 1 nil fatal error: unexpectedly found nil while unwrapping an Optional value

(раскадровка)

SplitViewController - NavigationController - (Master) CalculatorViewController 
    I 
NavigationController - (Detail) GraphViewController` 
  • синтаксис или назначение не так?
  • Я пытаюсь делегировать masterView UISplitView из деталей, следует ли мне попытаться установить делегат в masterView? Означает ли это, что деталь/graphView уже существует? (Это, кажется, что (errors creating a delegate from UISplitViewDetail to master in Swift) намекает на)

========

РЕШИТЬ!

Я работал вокруг этого вопроса, работая внутри prepareForSegue (с раскадровки Segue на кнопку под названием «Show Graph»)

//CalculatorViewController.swift: 
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject!) { 
    if (segue!.identifier == "Show Graph") { 
     var yourNextViewController = (segue!.destinationViewController as UINavigationController) 
     var detail = yourNextViewController.viewControllers[0] as GraphViewController 
     var tempview = detail.view // FORCES THE VIEW object into existence, without this it will compile, but next line will crash at runtime (graphView nil) 
     detail.graphView.calcDataSource = self 
    } 
} 

отмечают, что var tempview = detail.view имеет решающее значение здесь, несмотря на не используется. Я понимаю, как это настройка вида и выход ..

+0

UnWrap все УСТРОЙСТВА, не используйте '' особенно при отладке!. Также зарегистрируйте свой splitViewController, первый viewController и т. Д., Чтобы узнать, есть ли там или сколько там. Печать - ваш друг – Kametrixom

+0

Как правильно регистрировать VC? перегрузка didLoad() с помощью print()? как это сделать для VC, созданных с помощью раскадровки, например splitViewController? – John

ответ

0

Как (безопасно) развернет:

УСТРОЙСТВА
graphView.calcDataSource = splitViewController!.viewControllers.first!.subviews.first as CalculatorViewController 

if let vc = splitViewController?.viewControllers { 
    println(vc) 
    if let fst = vc.first { 
     println(fst.subviews) 
     println(fst.subviews.first) 
    } 
} 
+0

Предполагая, что блок if перед назначением (для получения результата) – John

Смежные вопросы