2016-04-01 5 views
0

У меня есть несколько точек на моем экране, и я пытаюсь их программно редактировать в функции.«неожиданно найдено nil» out of viewDidLoad

Xcode говорит:

неожиданно нашел ноль в то время как разворачивание опционального значения

Однако, когда я редактирую точки в viewDidLoad() только после того, как super.viewDidLoad(), он работает как шарм.

С помощью функции:

func test(){ 
    localDeviceNameView.stringValue = "some stuff" //Found nil here 

} 

С viewDidLoad:

override func viewDidLoad() { 
    super.viewDidLoad() 

    localDeviceNameView.stringValue = "some stuff" //Works well 

} 

Как я могу заставить его работать?

+0

try' self.localDeviceNameView.stringValue' – zcui93

+0

Уже пробовал :( – Lawris

+1

Тогда вам нужно разместить больше кода, например, исходную строку кода, полную версию 'test()', код, вызывающий 'test()', где угодно работа с 'localDeviceNameView' – zcui93

ответ

2

Вы можете использовать didSet на переменную. Как это:

@IBOutlet var localDeviceNameView : UIView! { 
    didSet { 
    localDeviceNameView.stringValue = "some stuff" 
    } 
} 

Что хорошо с этим подходом является то, что вы установили stringValue только тогда, когда localDeviceNameView установлен, который является правильным, когда он был загружен из СИБ/раскадровку.

Я думаю, что это именно то, что вам нужно.

+0

С этим, как я могу изменить свое значение после этого объявления? – Lawris

+1

Тогда вы, очевидно, можете не только использовать это. Я думаю, вам нужно понять жизненный цикл вашего UIViewController и как опции работают в Swift. Когда вы пытаетесь получить доступ к развернутому необязательному (cf 'UIView!'), Он _might_ все равно будет nil (он не должен, но может). Поэтому вы должны быть готовы и не пытаетесь напрямую обращаться к нему. Вместо этого в вашем методе 'test()' попробуйте обратиться к нему как 'localDeviceNameView? .stringValue =" some stuff "' – aimak

+0

Okey спасибо Я понимаю :) – Lawris

1

Вы пытаетесь позвонить test(), прежде чем представления будут полностью загружены, поэтому они еще не существуют. Сделайте это так:

class MyController: UIViewController { 
    var something = "" 

    override viewDidLoad() { 
     super.viewDidLoad() 
     localDeviceNameView.stringValue = something 
    } 
} 

Или позвоните you'r test() метод, только если вы уверены, чем загружены все виды (viewDidLoad() называли)

+0

Я попробую это в ближайшее время, вы вероятно, правильно – Lawris

+0

У меня возникла проблема с этим методом, когда я изменяю вашу переменную «что-то», t в ViewController ... Связано это или нет? – Lawris

+0

Нет, мой ответ объясняется только тем, почему ваше приложение выходит из строя. Если вам нужно связать их, используйте функцию didSet, как описано в ответе @aimak –

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