2016-03-31 3 views
0

Как возможно, что scrollview равен нулю при использовании первого: @IBAction afegeixGrafic, но при использовании @IBAction func button это не '? я получил класс GraficsBalancGlobalViewController, который является подклассом класса GraficViewControllerПочему мой scrollView равен нулю?

class GraficsBalancGlobalViewController: GraficViewController { 
    @IBAction func afegeixGrafic(sender: NSButton) { 
    addNewGrafic() // which is set on the GraficViewController 
    } 
} 

И когда я выполнить IBActionafegeixGrafic моя программа аварии на линии, отмеченной ниже:

class GraficViewController: NSViewController, GraficViewDataSource { 
    @IBAction func button(sender: NSButton) { 
    addNewGrafic() 
    } 

    func addNewGrafic() { 
    let frame = NSRect(x: 0, y: 0, width: self.view.bounds.width , height: self.view.bounds.width * 0.25) 
    let nouGrafic = GraficView(frame: frame) 
    scrollView.addSubview(nouGrafic) <---- BREAK here! 
    } 

    @IBOutlet weak var scrollView: NSView! 
    //...more code 
} 

Компилятор говорит, что:

fatal error: unexpectedly found nil while unwrapping an Optional value

но кнопка (IBAction) внутри GraficViewController работает хорошо л !! Поэтому я полагаю, что проблема связана с Scrollview, но я понятия не имею, что может быть .. Он инициализируется ..

Я стараюсь это тоже:

@IBOutlet weak var scrollView: NSView? { 
    didSet { 
    guard let sview = scrollView else { 
     addNewGrafic() 
     return // because scrollView is nil for some reason, but don't work 
    } 
    } 
} 

The call stack

enter image description here

Полный код:

class GraficsBalancGlobalViewController: GraficViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do view setup here. 
} 

@IBAction func afegeixGrafic(sender: NSButton) { 
    //performSegueWithIdentifier("Nou Grafic", sender: nil) 
    //let viewController = storyboard!.instantiateControllerWithIdentifier(identifier!) as! GraficsBalancGlobalViewController 
    addNewGrafic() 

} 

@IBAction func eliminaGrafic(sender: NSButton) { 
} 

} 

enter image description here

+0

'scrollView' всегда будет ноль в последнем блоке кода - это то, что охранник проверка - и она падает в еще только когда это nil –

+0

да, извините, что может ввести в заблуждение. Не заботьтесь о последней части кода, важно первое. –

+0

Покажите нам стек вызовов в точке ошибки. –

ответ

1

Его ноль из-за того, как вы создали экземпляр GraficsBalancGlobalViewController. Вы установили его с помощью xib или раскадровки, но вы создали его без него. ли это:

let viewController = storyboard.instantiateControllerWithIdentifier(identifier) as GraficsBalancGlobalViewController 

Не Это:

let viewController = GraficsBalancGlobalViewController() 
+0

Я использовал' let viewController = GraficsBalancGlobalViewController() '? Я новичок в этом. И где именно я должен использовать это: 'let viewController = storyboard.instantiateControllerWithIdentifier (идентификатор) как GraficsBalancGlobalViewController'? Не могли бы вы немного объяснить мне, как это работает? –

+0

Независимо от того, какой экземпляр экземпляра GraficsBalancGlobalViewController должен создать его таким образом. Я предполагаю, что где-то (не упомянуто выше) у вас есть строка вроде self.presentViewController (viewController, animated: true, completion: noil). То, что я сказал, идет чуть выше этого. Если он был создан и нажат так: self.performSegueWithIdentifier («GraficsBalancGlobalViewControllerID», отправитель: nil), и вы все равно получаете нуль, потому что что-то сломалось, когда вы создали IBOutlet.В этом случае удалите @IBOutlet слабый var scrollView и перетащите его из конструктора интерфейса снова. –

+0

Я думаю, что мой код не настолько продвинутый :(, вы ожидали этого? (Я добавляю код выше), я все еще учусь, как это сделать. –

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