I have a fully functional code that works perfectly on iOS >8.0 for iPhones >5 and all iPads, where I pass information and call function via Observers/Notifications, but on iPhone 4S it just doesn't work.
Through debugging, I actually found out that ONLY while running on iPhone 4S the observer gets added AFTER the notification gets posted.
This is happening on devices and on the simulator, on iOS 8 and 9, respectively.
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 using multiple collectionviews in the same view, and the nib files are named correctly
Is there any reason why the iPhone 4S does load the viewDidLoad method after the notification has been posted?
Managed to solve my problem. The iphone 4s screen size wasn't big enough to trigger the cellForIndex event and the class/observer wasn't initiated until the phone screen scrolled down.