Ich habe einen voll funktionsfähigen Code, der perfekt funktioniert für iOS> 8.0 für iPhones> 5 und alle iPads, wo ich Informationen weitergeben und Funktion über Beobachter/Benachrichtigungen, aber auf iPhone 4S es funktioniert einfach nicht.Observer wird nach postNotification NUR auf iPhone 4S hinzugefügt
Durch das Debuggen, ich fand tatsächlich heraus, dass NUR während auf dem iPhone 4S läuft der Beobachter wird NACH hinzugefügt die Benachrichtigung geschrieben wird.
Dies geschieht auf Geräten und im Simulator, jeweils auf iOS 8 und 9.
Code:
**PostNotification**
override func viewDidLoad() {
super.viewDidLoad()
self.registerCells()
UIApplication.sharedApplication().statusBarStyle = .LightContent
self.collectionView.delaysContentTouches = false
NSNotificationCenter.defaultCenter().addObserver(self, selector: "footerUpdateContentSize:", name: "footerUpdateContentSize", object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "seasonUpdateContentSize:", name: "seasonUpdateContentSize", object: nil)
self.loadDetailTVShow()
}
func registerCells()
{
self.collectionView.registerClass(HeaderDetailSeriesCell.self, forCellWithReuseIdentifier: "HeaderDetailSeriesCell")
self.collectionView.registerClass(FooterDetailSeriesCell.self, forCellWithReuseIdentifier: "FooterDetailSeriesCell")
self.collectionView.registerClass(SeriesSeasonContentCell.self, forCellWithReuseIdentifier: "SeriesSeasonContentCell")
}
func loadDetailTVShow()
{
let id: String! = (tvShow != nil) ? tvShow!.id! : episode!.seriesId!
ContentsClient().getContentById(id!).then { data -> Void in
let m: TVShow? = data as! TVShow?
self.tvShow = m!
self.collectionView.reloadData()
NSNotificationCenter.defaultCenter().postNotificationName("loadedTvShowlist", object: self.tvShow)
UIView.animateWithDuration(1.0, delay: 0, options: .TransitionNone, animations:
{
self.loadingView.alpha = 0.0
}, completion:nil)
}
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{
cell = collectionView.dequeueReusableCellWithReuseIdentifier("SeriesSeasonContentCell", forIndexPath: indexPath)
let seriesContent = cell as! SeriesSeasonContentCell
seriesContent.seriesContentCell?.tvShow = self.tvShow
seriesContent.contentView.frame = CGRect(x: 0.0, y: 0.0, width: width, height: heightSeason)
seriesContent.seriesContentCell?.view.frame = seriesContent.contentView.frame
}
**Observer**
class SeriesSeasonContent
override func viewDidLoad() {
super.viewDidLoad()
self.registerCells()
seasonSelectedIndex = 0
collectionView.reloadData()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "loadedTvShowlist:", name: "loadedTvShowlist", object: nil)
}
func registerCells()
{
self.seasonCollection.registerClass(SeasonViewCell.self, forCellWithReuseIdentifier: "SeasonViewCell")
self.collectionView.registerClass(EpisodeViewCell.self, forCellWithReuseIdentifier: "EpisodeViewCell")
}
func loadedTvShowlist(notification : NSNotification){
self.tvShow = notification.object! as? TVShow
if (tvShow?.seasons != nil && tvShow?.seasons?.count > 0)
{
self.currentSeason = ((tvShow?.seasons!.objectAtIndex(seasonSelectedIndex) as? Season)?.episodes)!
self.collectionView.reloadData()
self.seasonCollection.reloadData()
}
}
Obs: Im mehr collectionviews in der gleichen Ansicht verwenden, und die Feder-Dateien wird korrekt benannt
Gibt es einen Grund, warum das iPhone 4S die viewDidLoad Methode funktioniert laden nachdem die Benachrichtigung gesendet wurde?
Überprüfen Sie, ob Ihre Benachrichtigung im Hauptthread auf den problematischen Plattformen gepostet wird. Dieser Block ('ContentsClient(). GetContentById (id!). Then {' scheint ein Call-Back für den Datenabruf zu sein und Sie machen auch alle Arten von UI darin. –
Ja, es wird im Haupt-Thread gepostet, das ist was Das ist ein Whole-Call für den Datenabruf, aber ich verwende den PromiseKit-Pod, der diese Anfrage bearbeitet, und erst wenn die Anfrage beendet ist, wird der .then-Block ausgeführt ... –