仅在 iPhone 4 秒后在 postNotification 后添加观察者
Observer being added after postNotification ONLY on iPhone 4S
我有一个功能齐全的代码,可以在 iOS >8.0 for iPhones >5 和所有 iPad 上完美运行,我通过 Observers/Notifications 传递信息和调用函数,但是在 iPhone 4S 上它根本不起作用。
通过调试,我实际上发现 ONLY 而 运行 在 iPhone 4S 观察者被添加 AFTER 通知已发布。
这发生在设备和模拟器上,分别发生在 iOS 8 和 9。
代码:
**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:我在同一视图中使用多个集合视图,并且 nib 文件命名正确
iPhone 4S 在通知发布后加载 viewDidLoad 方法是否有任何原因?
设法解决了我的问题。 iphone 4s 屏幕尺寸不够大,无法触发 cellForIndex 事件,并且 class/observer 直到 phone 屏幕向下滚动才启动。
我有一个功能齐全的代码,可以在 iOS >8.0 for iPhones >5 和所有 iPad 上完美运行,我通过 Observers/Notifications 传递信息和调用函数,但是在 iPhone 4S 上它根本不起作用。
通过调试,我实际上发现 ONLY 而 运行 在 iPhone 4S 观察者被添加 AFTER 通知已发布。
这发生在设备和模拟器上,分别发生在 iOS 8 和 9。
代码:
**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:我在同一视图中使用多个集合视图,并且 nib 文件命名正确
iPhone 4S 在通知发布后加载 viewDidLoad 方法是否有任何原因?
设法解决了我的问题。 iphone 4s 屏幕尺寸不够大,无法触发 cellForIndex 事件,并且 class/observer 直到 phone 屏幕向下滚动才启动。