2015-05-14 2 views
0

Я использую XCode 6.3.1, и у меня возникла странная проблема, и я не могу понять это.IBOutlet nil после обновления данных

У меня есть контроллер просмотра на моей раскадровке, открытый с помощью модального сегмента. Когда ViewController открывается, он загружает некоторые данные из моего бэкэнд (Parse), он сначала смотрит в кеш и показывает кэшированные данные (если существует), в то время как обновленные данные с сервера извлекаются на фоне. Процесс является следующая:

  1. Получить кэшированные данные
  2. Если кэшированные данные существует обновит интерфейс
  3. Запрос данных сервера (в фоновом режиме)
  4. При поступлении данных интерфейсу обновление

Everything отлично работает до шага 4. Когда я пытаюсь обновить свой интерфейс, внезапно половина моего @IBOutlets равна nil и, конечно же, сбои приложения.

что мне не хватает ??

Вот код:

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 

    //eventId is set when the ViewController is instantiated 
    if eventId != nil { 
     loadEvent(eventId) 
    } 
} 

func loadEvent(id: String) { 

    var query = Event.query() 
    query?.cachePolicy = Util.getCachePolicy() //First look in cache, the request network data 
    query?.getObjectInBackgroundWithId(id, block: { (event: PFObject?, error: NSError?) -> Void in 

     if error == nil { 

      var updatedEvent = event as! Event 
      self.event = updatedEvent 
      self.updateLayout()  
      //When self.updateLayout() is called with cached data 
      //all my IBOutlets are fine but when it's called the second time, 
      //with data from server half of the IBOutlets are nil 
     } 
    }) 
} 

func updateLayout() { 

    if event != nil { 

     eventTitle.text = event.name 

     var paletteColor : UIColor! 
     var location = event.location 
     var locationName = location["name"] as! String 
     eventLocation.text = NSString(format: NSLocalizedString("event_subtitle", comment: ""), event.formattedTimes(), locationName) as String 

     eventDescription.text = event.abstract 

     if event.paletteColor != 0 { 
      paletteColor = Util.colorFromInt(event.paletteColor) 
      eventHeader.backgroundColor = paletteColor 
      speakersBlockTitle.textColor = paletteColor 
      mapButton.tintColor = paletteColor 
     } 

     if event.hasPhoto() { 

      self.eventPhoto.file = event.eventPhoto 
      self.eventPhoto.loadInBackground({ (image:UIImage?, error:NSError?) -> Void in 
       UIView.animateWithDuration(0.5, animations: {() -> Void in 

        self.eventPhoto.alpha = 1.0 
       }) 
      }) 

     } else { 
      self.eventPhoto.removeFromSuperview() 
      if paletteColor == nil { 
       paletteColor = eventHeader.backgroundColor 
      } 
      actionBar.backgroundColor = paletteColor 
     } 

     if event.speaker.isDataAvailable() { 

      var speaker = event.speaker 
      speakerName.text = speaker["name"] as? String 
      speakerInfo.text = speaker["speakerInfo"] as? String 
      speaker["speakerPhoto"]?.getDataInBackgroundWithBlock({ (imageData:NSData?, error:NSError?) -> Void in 
       if error == nil { 
        self.speakerPhoto.image = UIImage(data:imageData!) 
        self.speakerPhoto.layer.cornerRadius = self.speakerPhoto.frame.size.width/2 
        self.speakerPhoto.clipsToBounds = true 
       } 
      }) 
     } else { 
      speakerBlock.removeFromSuperview() 
     } 

     UIView.animateWithDuration(0.5, animations: {() -> Void in 

      self.eventHeader.alpha = 1.0 
      self.eventDescription.alpha = 1.0 
      self.speakerBlock.alpha = 1.0 
      self.mapButton.alpha = 1.0 
     }) 
    } 
} 

Это все Ниль IBOutlets: This are all the nil IBOutlets:

+0

Звучит l поскольку эти выходы освобождаются под вашими ногами. Являются ли они в отдельном диспетчере представлений, что вы не так хорошо ссылаетесь? Во всяком случае, мое лучшее предложение - объявить наблюдателя свойств (например, 'didSet') в этих точках и разместить там контрольную точку, чтобы узнать, когда и почему они устанавливаются на' nil'. – wltrup

+0

Что-то вроде этого: '@IBOutlet слабый var myOutlet: UIButton! { didSet { если myOutlet == ноль { // поставить точку останова на следующей строке Println ("myOutlet установлен в ноль") }} } ' – wltrup

+0

Я попробую. 'IBOutlets' на том же контроллере представления btw –

ответ

0

Поскольку код в моем комментарии выше не отображается правильно, вот этот комментарий снова:

Что-то вроде этого:

@IBOutlet weak var myOutlet: UIButton! { 
    didSet { 
     if myOutlet == nil { 
      // put a breakpoint on the next line 
      println("myOutlet set to nil") 
     } 
    } 
} 
+0

хороший совет, но это было прекрасно, как комментарий. вставка его в редактор кода приведет к достаточно хорошему форматированию. – danh

+0

Правда, но легче читать, когда он хорошо отформатирован. – wltrup

+0

Итак, я попробовал: @IBOutlet слабые динамики varBlockTitle: CustomUILabel! { didSet { если speakersBlockTitle == ноль { // поставить точку останова на следующей строке Println ("myOutlet установлен в ноль") }} } Но не повезло, то приложение падает, даже не замечая точка останова –

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