Я использую XCode 6.3.1, и у меня возникла странная проблема, и я не могу понять это.IBOutlet nil после обновления данных
У меня есть контроллер просмотра на моей раскадровке, открытый с помощью модального сегмента. Когда ViewController открывается, он загружает некоторые данные из моего бэкэнд (Parse), он сначала смотрит в кеш и показывает кэшированные данные (если существует), в то время как обновленные данные с сервера извлекаются на фоне. Процесс является следующая:
- Получить кэшированные данные
- Если кэшированные данные существует обновит интерфейс
- Запрос данных сервера (в фоновом режиме)
- При поступлении данных интерфейсу обновление
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:
Звучит l поскольку эти выходы освобождаются под вашими ногами. Являются ли они в отдельном диспетчере представлений, что вы не так хорошо ссылаетесь? Во всяком случае, мое лучшее предложение - объявить наблюдателя свойств (например, 'didSet') в этих точках и разместить там контрольную точку, чтобы узнать, когда и почему они устанавливаются на' nil'. – wltrup
Что-то вроде этого: '@IBOutlet слабый var myOutlet: UIButton! { didSet { если myOutlet == ноль { // поставить точку останова на следующей строке Println ("myOutlet установлен в ноль") }} } ' – wltrup
Я попробую. 'IBOutlets' на том же контроллере представления btw –