2016-11-03 2 views
1

У меня есть fatal error: unexpectedly found nil while unwrapping an Optional value для IBOutlet.Ниль при разворачивании дополнительного значения IBOutlet

В моем пользовательском представлении я связал свою розетку с файлом XIB. Я дважды проверил это. Вот как это выглядит:

@IBOutlet weak var label: UILabel! { 
    didSet { 
     label.textColor = .redColor() 
    } 
} 

Моя реализация layoutSubviews выглядит следующим образом:

override func layoutSubviews() { 
    super.layoutSubviews() 

    label.preferredMaxLayoutWidth = label.frame.size.width 
} 

Несмотря на то, что layoutSubviews метод должен быть вызван после того, как элементы пользовательского интерфейса инициализации, я получаю сообщение об ошибке:

fatal error: unexpectedly found nil while unwrapping an Optional value 

Эта ошибка вызвана линии:

label.preferredMaxLayoutWidth = label.frame.size.width 

Почему это так? Как это исправить?

+1

Возможно, связь между раскадрой и файлом сломана, попробуйте создать новую ссылку (ctrl + drag) на ваш IBoutlet –

+0

Я пробовал это несколько раз. Ссылка в порядке. –

+0

Как вы создаете экземпляр контроллера вида? – Paulw11

ответ

1

Попробуйте сделать это в viewDidLayoutSubviews вместо layoutSubviews. Элементы UI должны быть готовы в viewDidLayoutSubviews, но не обязательно в layoutSubviews.

+0

Да, но проблема в том, что это представление, а не контроллер вида –

+0

' awakeFromNib() '? – dirtydanee

+0

Этот метод не подходит для меня. –

0

Вы можете предотвратить возникновение сбоя, безопасно разворачивая ярлык с помощью оператора if let.

if let mylabel = label { 
    mylabel.preferredMaxLayoutWidth = mylabel.frame.size.width 
} 
+0

Да, но для меня это интересно, почему лейбл не готов? Кроме того, где гарантия, что 'preferredMaxLayoutWidth' будет настроен? –

+0

читайте это: http: // stackoverflow.com/questions/7588066/loading-custom-uiview-from-nib-all-subviews-contains-in-nib-are-nil – iGenio

+0

@iGenio что именно я читаю? – Nyakiba

0

Вы должны использовать:

label?.preferredMaxLayoutWidth = label.frame.size.width 

это раньше в начале вызова layoutSubviews выпускного отверстия не может быть еще выставиться, но при следующем вызове будет. Используя цепочку ссылок, вы можете избежать явной необязательной развертки. если метка равна нулю, присваивание автоматически пропущено.

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