Swift UICollectionView cellForItemAtIndexPath 上的专门崩溃
Swift Specialised Crash on UICollectionView cellForItemAtIndexPath
Crashlytics 为我提供了以下堆栈跟踪。
崩溃发生不一致。发生在所有 iOS 9 台设备上,但很少见。无法找出问题的根源。
在我拥有的任何设备上都没有发生过,过去 3 天一直试图崩溃。
Crashed: com.apple.main-thread
0 cherish 0x10014ee18 specialized PersonalizeViewController.collectionView(UICollectionView, cellForItemAtIndexPath : NSIndexPath) -> UICollectionViewCell (PersonalizeViewController.swift:159)
1 cherish 0x1001497f0 @objc PersonalizeViewController.collectionView(UICollectionView, cellForItemAtIndexPath : NSIndexPath) -> UICollectionViewCell (PersonalizeViewController.swift)
2 UIKit 0x188aef3a8 <redacted> + 432
3 UIKit 0x188311adc <redacted> + 4628
4 UIKit 0x18830c808 <redacted> + 228
5 UIKit 0x1882a81e4 <redacted> + 656
6 QuartzCore 0x185c3a994 <redacted> + 148
7 QuartzCore 0x185c355d0 <redacted> + 292
8 QuartzCore 0x185c35490 <redacted> + 32
9 QuartzCore 0x185c34ac0 <redacted> + 252
10 QuartzCore 0x185c34820 <redacted> + 500
11 QuartzCore 0x185c2dde4 <redacted> + 80
12 CoreFoundation 0x183104728 <redacted> + 32
13 CoreFoundation 0x1831024cc <redacted> + 372
14 CoreFoundation 0x1831028fc <redacted> + 928
15 CoreFoundation 0x18302cc50 CFRunLoopRunSpecific + 384
16 GraphicsServices 0x184914088 GSEventRunModal + 180
17 UIKit 0x188316088 UIApplicationMain + 204
18 cherish 0x100142a50 main (AppDelegate.swift:19)
19 libdispatch.dylib 0x182bca8b8 (Missing)
崩溃的代码是:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
if collectionView.tag == 1 {
(---crash line---) let cell = select_date_collection_view.dequeueReusableCellWithReuseIdentifier(PERSONALIZE_SELECT_DATE_COLLECTION_CELL_IDENTIFIER, forIndexPath: indexPath) as! SelectDateCollectionViewCell
// Some changes to cell objects
return cell
} else if collectionView.tag == 2 {
let cell = select_time_collection_view.dequeueReusableCellWithReuseIdentifier(PERSONALIZE_SELECT_TIME_COLLECTION_CELL_IDENTIFIER, forIndexPath: indexPath) as! SelectTimeCollectionViewCell
// Some changes to cell objects
return cell
} else if collectionView.tag == 3 {
let cell = add_customization_collection_view.dequeueReusableCellWithReuseIdentifier(PERSONALIZE_ADD_CUSTOMIZATION_COLLECTION_CELL_IDENTIFIER, forIndexPath: indexPath) as! AddCustomizationCollectionViewCell
// Some changes to cell objects
return cell
}
let cell: UICollectionViewCell = UICollectionViewCell()
return cell
}
已经在viewDidLoad()中初始化了所有的集合视图
select_date_collection_view.registerNib(UINib(nibName: "SelectDateCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: PERSONALIZE_SELECT_DATE_COLLECTION_CELL_IDENTIFIER)
select_date_collection_view.tag = 1
select_date_collection_view.dataSource = self
select_date_collection_view.delegate = self
select_date_collection_view.showsHorizontalScrollIndicator = false
select_date_collection_view.showsVerticalScrollIndicator = false
select_date_collection_view.reloadData()
select_time_collection_view.registerNib(UINib(nibName: "SelectTimeCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: PERSONALIZE_SELECT_TIME_COLLECTION_CELL_IDENTIFIER)
select_time_collection_view.tag = 2
select_time_collection_view.dataSource = self
select_time_collection_view.delegate = self
select_time_collection_view.showsHorizontalScrollIndicator = false
select_time_collection_view.showsVerticalScrollIndicator = false
hideSelectTimeView()
add_customization_collection_view.registerNib(UINib(nibName: "AddCustomizationCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: PERSONALIZE_ADD_CUSTOMIZATION_COLLECTION_CELL_IDENTIFIER)
add_customization_collection_view.tag = 3
add_customization_collection_view.dataSource = self
add_customization_collection_view.delegate = self
add_customization_collection_view.showsHorizontalScrollIndicator = false
add_customization_collection_view.showsVerticalScrollIndicator = false
hideCustomizationsView()
错误发生不一致,这是引起关注的主要原因。因为我无法找出问题所在,而且 itunes 或 Crashlytics 的崩溃日志也无济于事。
我终于得到了一个崩溃的 iphone。
结果发现有几个问题:
iOS、Crashlytics 和 iTunes 的崩溃报告完全没用。代码崩溃的实际位置从来没有被他们标记过,而是在调试模式下崩溃时被标记为 xcode 。所以不要相信 crashlytics 或 itunes 生成的报告。
实际问题是我从服务器获得了 'HH:mm:ss' 格式的时间,我正在将其转换为 'hh:mm a' 格式,因为我想要我的 [=27= 的 AM,PM ].现在 iOS 所做的伟大事情是,如果用户将他的 phone 时间设置为 24 小时格式,则不会返回 AM/PM 并且应用程序会崩溃,因为我没有检查返回的字符串是否为零。为了解决上述问题,我必须将语言环境设置为:
df.locale = NSLocale(localeIdentifier: "en_US_POSIX")
问题终于解决了。
主要学习是不要依赖 crashlytics 或 Itunes 报告
注册这个单元格 -
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "default")
然后 return 下面的代码行代替 UICollectionViewCell() -
collectionView.dequeueReusableCell(withReuseIdentifier: "default", for: indexPath)
在集合视图中,如果您 return 空白单元格应用程序崩溃,因为空白单元格没有标识符。
Crashlytics 为我提供了以下堆栈跟踪。 崩溃发生不一致。发生在所有 iOS 9 台设备上,但很少见。无法找出问题的根源。 在我拥有的任何设备上都没有发生过,过去 3 天一直试图崩溃。
Crashed: com.apple.main-thread
0 cherish 0x10014ee18 specialized PersonalizeViewController.collectionView(UICollectionView, cellForItemAtIndexPath : NSIndexPath) -> UICollectionViewCell (PersonalizeViewController.swift:159)
1 cherish 0x1001497f0 @objc PersonalizeViewController.collectionView(UICollectionView, cellForItemAtIndexPath : NSIndexPath) -> UICollectionViewCell (PersonalizeViewController.swift)
2 UIKit 0x188aef3a8 <redacted> + 432
3 UIKit 0x188311adc <redacted> + 4628
4 UIKit 0x18830c808 <redacted> + 228
5 UIKit 0x1882a81e4 <redacted> + 656
6 QuartzCore 0x185c3a994 <redacted> + 148
7 QuartzCore 0x185c355d0 <redacted> + 292
8 QuartzCore 0x185c35490 <redacted> + 32
9 QuartzCore 0x185c34ac0 <redacted> + 252
10 QuartzCore 0x185c34820 <redacted> + 500
11 QuartzCore 0x185c2dde4 <redacted> + 80
12 CoreFoundation 0x183104728 <redacted> + 32
13 CoreFoundation 0x1831024cc <redacted> + 372
14 CoreFoundation 0x1831028fc <redacted> + 928
15 CoreFoundation 0x18302cc50 CFRunLoopRunSpecific + 384
16 GraphicsServices 0x184914088 GSEventRunModal + 180
17 UIKit 0x188316088 UIApplicationMain + 204
18 cherish 0x100142a50 main (AppDelegate.swift:19)
19 libdispatch.dylib 0x182bca8b8 (Missing)
崩溃的代码是:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
if collectionView.tag == 1 {
(---crash line---) let cell = select_date_collection_view.dequeueReusableCellWithReuseIdentifier(PERSONALIZE_SELECT_DATE_COLLECTION_CELL_IDENTIFIER, forIndexPath: indexPath) as! SelectDateCollectionViewCell
// Some changes to cell objects
return cell
} else if collectionView.tag == 2 {
let cell = select_time_collection_view.dequeueReusableCellWithReuseIdentifier(PERSONALIZE_SELECT_TIME_COLLECTION_CELL_IDENTIFIER, forIndexPath: indexPath) as! SelectTimeCollectionViewCell
// Some changes to cell objects
return cell
} else if collectionView.tag == 3 {
let cell = add_customization_collection_view.dequeueReusableCellWithReuseIdentifier(PERSONALIZE_ADD_CUSTOMIZATION_COLLECTION_CELL_IDENTIFIER, forIndexPath: indexPath) as! AddCustomizationCollectionViewCell
// Some changes to cell objects
return cell
}
let cell: UICollectionViewCell = UICollectionViewCell()
return cell
}
已经在viewDidLoad()中初始化了所有的集合视图
select_date_collection_view.registerNib(UINib(nibName: "SelectDateCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: PERSONALIZE_SELECT_DATE_COLLECTION_CELL_IDENTIFIER)
select_date_collection_view.tag = 1
select_date_collection_view.dataSource = self
select_date_collection_view.delegate = self
select_date_collection_view.showsHorizontalScrollIndicator = false
select_date_collection_view.showsVerticalScrollIndicator = false
select_date_collection_view.reloadData()
select_time_collection_view.registerNib(UINib(nibName: "SelectTimeCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: PERSONALIZE_SELECT_TIME_COLLECTION_CELL_IDENTIFIER)
select_time_collection_view.tag = 2
select_time_collection_view.dataSource = self
select_time_collection_view.delegate = self
select_time_collection_view.showsHorizontalScrollIndicator = false
select_time_collection_view.showsVerticalScrollIndicator = false
hideSelectTimeView()
add_customization_collection_view.registerNib(UINib(nibName: "AddCustomizationCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: PERSONALIZE_ADD_CUSTOMIZATION_COLLECTION_CELL_IDENTIFIER)
add_customization_collection_view.tag = 3
add_customization_collection_view.dataSource = self
add_customization_collection_view.delegate = self
add_customization_collection_view.showsHorizontalScrollIndicator = false
add_customization_collection_view.showsVerticalScrollIndicator = false
hideCustomizationsView()
错误发生不一致,这是引起关注的主要原因。因为我无法找出问题所在,而且 itunes 或 Crashlytics 的崩溃日志也无济于事。
我终于得到了一个崩溃的 iphone。 结果发现有几个问题:
iOS、Crashlytics 和 iTunes 的崩溃报告完全没用。代码崩溃的实际位置从来没有被他们标记过,而是在调试模式下崩溃时被标记为 xcode 。所以不要相信 crashlytics 或 itunes 生成的报告。
实际问题是我从服务器获得了 'HH:mm:ss' 格式的时间,我正在将其转换为 'hh:mm a' 格式,因为我想要我的 [=27= 的 AM,PM ].现在 iOS 所做的伟大事情是,如果用户将他的 phone 时间设置为 24 小时格式,则不会返回 AM/PM 并且应用程序会崩溃,因为我没有检查返回的字符串是否为零。为了解决上述问题,我必须将语言环境设置为:
df.locale = NSLocale(localeIdentifier: "en_US_POSIX")
问题终于解决了。 主要学习是不要依赖 crashlytics 或 Itunes 报告
注册这个单元格 -
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "default")
然后 return 下面的代码行代替 UICollectionViewCell() -
collectionView.dequeueReusableCell(withReuseIdentifier: "default", for: indexPath)
在集合视图中,如果您 return 空白单元格应用程序崩溃,因为空白单元格没有标识符。