2016-01-27 2 views
0

Я, вероятно, просто что-то пропустил, но для жизни меня не могу понять.swift: неожиданно найдено нуль при разворачивании необязательного значения в awakeFromNib()

Я работаю над приложением с структурой MVC; Я помещаю все необходимые поля на XIb, но я полагаюсь на View, чтобы реально изменить шрифт, размер и т.д.

Вот мой код:

import Foundation 
import UIKit 

protocol ProductionWellChemistryFormTwoViewDelegate { 

} 

class ProductionWellChemistryFormTwoView: BaseUIView { 

    let fontSizeL : CGFloat = 18 
    let fontName : String = "Futura" 
    var delegate : ProductionWellChemistryFormTwoViewDelegate! 

    @IBOutlet weak var labelTitle: UILabel! 
    @IBOutlet weak var labelFieldCode: UILabel! 
    @IBOutlet weak var labelGasFlaskNo: UILabel! 
    @IBOutlet weak var labelDatePrepared: UILabel! 
    @IBOutlet weak var labelDateVacuumed: UILabel! 
    @IBOutlet weak var labelClickingSound: UILabel! 
    @IBOutlet weak var labelTimeStarted: UILabel! 
    @IBOutlet weak var labelTimeFinished: UILabel! 
    @IBOutlet weak var labelWHPStarted: UILabel! 
    @IBOutlet weak var labelWHPEnded: UILabel! 
    @IBOutlet weak var labelSPPStarted: UILabel! 
    @IBOutlet weak var labelSPPEnded: UILabel! 
    @IBOutlet weak var labelSPStarted: UILabel! 
    @IBOutlet weak var labelSPEnded: UILabel! 
    @IBOutlet weak var labelRemarks: UILabel! 

    @IBOutlet weak var textfieldFieldCode: UITextField! 
    @IBOutlet weak var textfieldGasFlaskNo: UITextField! 
    @IBOutlet weak var textfieldDatePrepared: UITextField! 
    @IBOutlet weak var textfieldDateVacuumed: UITextField! 
    @IBOutlet weak var textfieldTimeStarted: UITextField! 
    @IBOutlet weak var textfieldTimeFinished: UITextField! 
    @IBOutlet weak var textfieldWHPStarted: UITextField! 
    @IBOutlet weak var textfieldWHPEnded: UITextField! 
    @IBOutlet weak var textfieldSPPStarted: UITextField! 
    @IBOutlet weak var textfieldSPPEnded: UITextField! 
    @IBOutlet weak var textfieldSPStarted: UITextField! 
    @IBOutlet weak var textfieldSPEnded: UITextField! 
    @IBOutlet weak var textviewRemarks: UITextView! 

    @IBOutlet weak var switchClickSound: UISwitch! 

    override func awakeFromNib() { 
     self.labelTitle.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelFieldCode.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelGasFlaskNo.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelDatePrepared.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelDateVacuumed.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelClickingSound.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelTimeStarted.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelTimeFinished.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelWHPStarted.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelWHPEnded.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelSPPStarted.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelSPPEnded.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelSPStarted.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelSPEnded.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.labelRemarks.font = UIFont(name: self.fontName, size: self.fontSizeL) 

     self.textfieldFieldCode.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textfieldGasFlaskNo.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textfieldDatePrepared.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textfieldDateVacuumed.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textfieldTimeStarted.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textfieldTimeFinished.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textfieldWHPStarted.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textfieldWHPEnded.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textfieldSPPStarted.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textfieldSPPEnded.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textfieldSPStarted.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textfieldSPEnded.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textviewRemarks.font = UIFont(name: self.fontName, size: self.fontSizeL) 
     self.textviewRemarks.layer.borderWidth = 1.0 
     self.textviewRemarks.layer.borderColor = UIColor.blackColor().CGColor 
     self.textviewRemarks.text = "" 
    } 
} 

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

Я сделал это примерно в полтора десятка раз, поэтому я действительно не уверен, что происходит. Единственное, что я могу думать о том, что я сделал по-другому, - это попытаться исправить предыдущий Unknown class in Interface Builder file, перейдя в исходный код Xib и переименовав класс ProductionWellChemistryFormTwoViewer, ошибочно названный класс, который я тогда переименовал в мой класс (без предыдущего представления).

Приложение запускается, если я отключу все внутри awakeFromNib().

EDIT: Приложение также работает хорошо, шрифты и все, если изменить следующую строку в исходном XIB код:

<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vYc-5l-gfD" userLabel="ContentView" customClass="ProductionWellChemistryFormTwoView" customModule="Integra_Geochemistry" customModuleProvider="target"> 

Назад:

<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vYc-5l-gfD" userLabel="ContentView" customClass="ProductionWellChemistryFormTwoViewer" customModule="Integra_Geochemistry" customModuleProvider="target"> 

я получаю ошибку Unknown class _TtC20Integra_Geochemistry36ProductionWellChemistryFormTwoViewer in Interface Builder file. , но по крайней мере он работает.

Я расширить на ситуацию я уже упоминал выше, вот что случилось:

  1. Я создал XIB.
  2. Я создал вид, ошибочно названный ProductionWellChemistryFormTwoViewer
  3. Установите класс XIB в указанный вид.
  4. Обнаружено о неправильном названии.
  5. Изменено имя ProductionWellChemistryFormTwoView. Некоторые ошибки всплывают.
  6. Вручную сменила любую ссылку на ProductionWellChemistryFormTwoViewer на ProductionWellChemistryFormTwoView.
  7. Заметил, что приложение запускает ошибку unknown class, отправляется в источник XIB, удаляется ProductionWellChemistryFormTwoViewer.
  8. THEN Я получил ошибки выше.
+0

О, gadd, это какой-то неудобный код прямо там ... – LinusGeffarth

+1

Я думаю, вы должны добавить еще несколько IBOutlets ...(/ сарказм), но со всей серьезностью я бы рекомендовал вам применить новый подход к реализации этого, это адский кошмар на данный момент. Вероятно, вы должны использовать IBOutletCollections. – Hamish

+2

Прежде всего, это довольно неэффективно для создания десятков одного и того же экземпляра 'UIFont'. Проверьте, является ли шрифт 'nil'. – vadian

ответ

1

Так что, по всей вероятности, вы не связывали один из этих IBOutlets.

С этим множеством выходов будет сложно понять, какой из них, поэтому я предлагаю вам воспользоваться предложением @ originaluser2 и использовать IBCollections.

class ProductionWellChemistryFormTwoView: BaseUIView { 
    let fontSizeL : CGFloat = 18 
    let fontName : String = "Futura" 
    var delegate : ProductionWellChemistryFormTwoViewDelegate! 

    // By declaring the IBOutlet as an array it tells IB that its a collection 
    @IBOutlet var labelCollection: [UILabel]! 
    @IBOutlet var textFieldCollection: [UITextField]! 

    @IBOutlet weak var textviewRemarks: UITextView! 

    override func awakeFromNib() { 
     let font = UIFont(name: self.fontName, size: self.fontSizeL) 
     labelCollection.each{ $0.font = font } 
     textFieldCollection.each{ $0.font = font } 

     textviewRemarks.layer.borderWidth = 1.0 
     textviewRemarks.layer.borderColor = UIColor.blackColor().CGColor 
     textviewRemarks.text = "" 
    } 
} 

Затем пройдите через свой xib и соедините все розетки по мере необходимости.

+0

Я не знаю почему, но он говорит, что labelCollection не имеет функции 'each' - мне приходилось прибегать к циклу for. Кроме того, как я могу получить доступ к отдельным ярлыкам и текстовым полям в моем контроллере? Я сделал только ярлыки и прокомментировал текстовые поля. Наконец, это не сработало. Все еще сбой на 'awakeForNib()'. –

+0

Это 'labelCollection.forEach' – Eendje

+0

Извините, как я уже говорил выше, не слишком хорошо разбираюсь в Swift. В любом случае, это не сработало, даже если я сделал это по-своему. Я обновил свой вопрос выше с некоторыми новыми выводами. Возможно, они могут помочь. –

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

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