Вот моя ситуация. У меня UICollectionView
, вложенное в UITableVIew
, табличное представление прокручивается по вертикали, а коллекционное представление прокручивается по горизонтали внутри табличного представления.
Я сделал табличное представление в качестве делегата для представление коллекции здесь фрагмент кода:
я знаю, что этот код не имеет смысла, потому что я удалил много вещей из него, я просто поделился им, ребята, чтобы посмотреть, как я настраиваю представление таблицы и представление коллекции в случае это полезно
class HomeViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UICollectionViewDataSource,UICollectionViewDelegate{
@IBOutlet weak var homeTable: UITableView!
func languageDidChange(){
tabBarItem.title = NSLocalizedString("home", comment: "")
homeTitle.text = NSLocalizedString("browseservice", comment: "")
}
@objc func languageDidChangeNotification(notification:NSNotification){
languageDidChange()
}
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(languageDidChangeNotification(notification:)), name: NSNotification.Name(rawValue: "LANGUAGE_DID_CHANGE"), object: nil)
languageDidChange()
SVProgressHUD.setDefaultMaskType(.custom)
SVProgressHUD.show(withStatus: "Loading...")
request.sendRequest("/some/url", headers: [:], method: .get, completion: {serverResponse in
if(serverResponse != nil){
//refresh the tableview when fetching data is complete
DispatchQueue.main.async {
self.homeTable.reloadData()
SVProgressHUD.dismiss()
}
}else{
SVProgressHUD.dismiss()
//show network error dialog
}
})
homeTable.delegate = self
homeTable.dataSource = self
}
let cellSpacingHeight: CGFloat = 0
func numberOfSections(in tableView:UITableView)->Int{
//number of categories:vertical
return 3
}
func tableView(_ tableView:UITableView,numberOfRowsInSection section:Int)->Int{
return 1
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return cellSpacingHeight
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView = UIView()
headerView.backgroundColor = UIColor.clear
return headerView
}
func tableView(_ tableView:UITableView,cellForRowAt indexPath: IndexPath)->UITableViewCell{
let cell = tableView.dequeueReusableCell(withIdentifier: "CategoryCell") as! CategoryCell
//set the tabeview as the delegate for the collection view
cell.collectionView.delegate = self
cell.collectionView.dataSource = self
cell.collectionView.reloadData()
cell.collectionView.tag = indexPath.section
cell.serviceCategoryName.text = someTitles[indexPath.section]
return cell
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
for i in 0 ..< servicesData.count {
//this checks is the current tableview cell is equal to the current collection view cell
//if it is then the current collectionview cell belongs to the current tableview cell
//which it will then tell it how many elemnts are in the current tableview cell
if(collectionView.tag == servicesData[i].catId){
return servicesData[i].count
}
}
return 0
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "serviceCell", for: indexPath) as! ServiceCollectionCell
cell.serviceName.text = servicesResponse["data"][collectionView.tag]["subcategories"][indexPath.row]["name"].stringValue
let imageUrl = servicesResponse["data"][collectionView.tag]["subcategories"][indexPath.row]["photo"].stringValue
cell.serviceImg.loadImageFromUrl(url: imageUrl)
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
//handle the click
}
}
class ServiceCollectionCell: UICollectionViewCell {
//a cell inside the collection view with image and a title
@IBOutlet weak var serviceImg: UIImageView!
@IBOutlet weak var serviceName: UILabel!
}
class CategoryCell: UITableViewCell {
//this is a single tableview cell containg the collection view
//every tableview cell has a collection view inside it
@IBOutlet weak var serviceCategoryName: UILabel!
@IBOutlet weak var collectionView: UICollectionView!
}
теперь проблема в том, что этот код вылетает только на iOS 13
Я пробовал его с другими версиями и работает нормально, вот ошибка, которую дает мне:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSPlaceholderString initWithString:]: nil argument'
вот полная трассировка стека:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSPlaceholderString initWithString:]: nil argument'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff23c7127e __exceptionPreprocess + 350
1 libobjc.A.dylib 0x00007fff513fbb20 objc_exception_throw + 48
2 Foundation 0x00007fff2577d523 -[NSPlaceholderString initWithValidatedFormat:validFormatSpecifiers:locale:arguments:error:] + 0
3 Foundation 0x00007fff2577606b +[NSString stringWithString:] + 45
4 UIFoundation 0x00007fff4754444b __NSNormalizedLanguage + 97
5 UIFoundation 0x00007fff475443d3 ____NSNormalizedPreferredLanguage_block_invoke + 49
6 libdispatch.dylib 0x0000000105d7ad48 _dispatch_client_callout + 8
7 libdispatch.dylib 0x0000000105d7c297 _dispatch_once_callout + 66
8 UIFoundation 0x00007fff475440b0 -[NSParagraphArbitrator lineBreakContextBeforeIndex:lineFragmentWidth:range:] + 2859
9 UIFoundation 0x00007fff475694c4 -[NSCoreTypesetter _stringDrawingCoreTextEngineWithOriginalString:rect:padding:graphicsContext:forceClipping:attributes:stringDrawingOptions:drawingContext:wantsTextLineFragments:validatedAttributedString:firstNonRenderedCharacterIndex:foundSoftHyphenAtEOL:enginePathUsed:] + 5554
10 UIFoundation 0x00007fff47562a67 __NSStringDrawingEngine + 5999
11 UIFoundation 0x00007fff475612ce -[NSString(NSExtendedStringDrawing) boundingRectWithSize:options:attributes:context:] + 187
12 UIKitCore 0x00007fff484bd306 -[UILabel _textRectForBounds:limitedToNumberOfLines:includingShadow:] + 1456
13 UIKitCore 0x00007fff484bcb37 -[UILabel textRectForBounds:limitedToNumberOfLines:] + 50
14 UIKitCore 0x00007fff484c2519 -[UILabel _intrinsicSizeWithinSize:] + 384
15 UIKitCore 0x00007fff484c2831 -[UILabel intrinsicContentSize] + 245
16 UIKitCore 0x00007fff4848dd23 -[UIView(UIConstraintBasedLayout) _generateContentSizeConstraints] + 35
17 UIKitCore 0x00007fff4848d9f9 -[UIView(UIConstraintBasedLayout) _updateContentSizeConstraints] + 402
18 UIKitCore 0x00007fff484988ed -[UIView(AdditionalLayoutSupport) _updateSystemConstraints] + 112
19 UIKitCore 0x00007fff48497464 -[UIView(AdditionalLayoutSupport) _sendUpdateConstraintsIfNecessaryForSecondPass:] + 489
20 UIKitCore 0x00007fff48497a38 -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 1193
21 UIKitCore 0x00007fff484978c5 -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 822
22 UIKitCore 0x00007fff484978c5 -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 822
23 Foundation 0x00007fff258d8263 -[NSISEngine withBehaviors:performModifications:] + 84
24 UIKitCore 0x00007fff48497c4e -[UIView(AdditionalLayoutSupport) _recursiveUpdateConstraintsIfNeededCollectingViews:forSecondPass:] + 112
25 UIKitCore 0x00007fff484978c5 -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 822
26 UIKitCore 0x00007fff484978c5 -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 822
27 UIKitCore 0x00007fff484978c5 -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededCollectingViews:forSecondPass:] + 822
28 Foundation 0x00007fff258d8263 -[NSISEngine withBehaviors:performModifications:] + 84
29 UIKitCore 0x00007fff48497f13 -[UIView(AdditionalLayoutSupport) _updateConstraintsIfNeededWithViewForVariableChangeNotifications:] + 632
30 UIKitCore 0x00007fff48498c51 -[UIView(AdditionalLayoutSupport) _updateConstraintsAtEngineLevelIfNeededWithViewForVariableChangeNotifications:] + 393
31 UIKitCore 0x00007fff48563fda -[UIView(Hierarchy) _updateConstraintsAsNecessaryAndApplyLayoutFromEngine] + 272
32 UIKitCore 0x00007fff485784bd -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2478
33 QuartzCore 0x00007fff2b131db1 -[CALayer layoutSublayers] + 255
34 QuartzCore 0x00007fff2b137fa3 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 517
35 UIKitCore 0x00007fff48563635 -[UIView(Hierarchy) layoutBelowIfNeeded] + 980
36 UIKitCore 0x00007fff4856a626 +[UIView(Animation) performWithoutAnimation:] + 84
37 UIKitCore 0x00007fff48297660 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 1291
38 UIKitCore 0x00007fff4826043b -[UITableView _updateVisibleCellsNow:] + 3081
39 UIKitCore 0x00007fff4828055f -[UITableView layoutSubviews] + 194
40 UIKitCore 0x00007fff485784bd -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2478
41 QuartzCore 0x00007fff2b131db1 -[CALayer layoutSublayers] + 255
42 QuartzCore 0x00007fff2b137fa3 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 517
43 QuartzCore 0x00007fff2b1438da _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 80
44 QuartzCore 0x00007fff2b08a848 _ZN2CA7Context18commit_transactionEPNS_11TransactionEd + 324
45 QuartzCore 0x00007fff2b0bfb51 _ZN2CA11Transaction6commitEv + 643
46 QuartzCore 0x00007fff2b0c04ba _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 76
47 CoreFoundation 0x00007fff23bd3867 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
48 CoreFoundation 0x00007fff23bce2fe __CFRunLoopDoObservers + 430
49 CoreFoundation 0x00007fff23bce97a __CFRunLoopRun + 1514
50 CoreFoundation 0x00007fff23bce066 CFRunLoopRunSpecific + 438
51 GraphicsServices 0x00007fff384c0bb0 GSEventRunModal + 65
52 UIKitCore 0x00007fff48092d4d UIApplicationMain + 1621
53 Taskmoby 0x000000010383d12b main + 75
54 libdyld.dylib 0x00007fff5227ec25 start + 1
55 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
теперь я попытался отладить проблему, вот что я нашел:
- ошибка происходит только на iOS 13 - данные, поступающие с сервера, завершены отсутствуют пропущенные значения или значения nil, потому что это работает в более ранних версиях - ошибка возникает только в том случае, если внутри ячейки табличного представления должна отображаться ячейка коллекции. d изменив эту функцию с этой:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if(collectionView.tag == servicesData[i].catId){
return servicesData[i].count
}
}
return 0
}
на
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if(collectionView.tag == servicesData[i].catId){
return 0
}
}
return 0
}
, так что независимо от того, что он всегда возвращает ноль collectionview cell
элементов, это делает tableview cell
пустым и ошибка не делает произойдет, когда я сделаю это. это только там, когда есть collectionview cell
, который будет отображен внутри tableview cell
.
, я также дважды проверил все IBOutlets
на раскадровке и ViewController
, и я использование XCode 11
это очень запутанно, я знаю, но если вы можете предложить что-то, что может вызывать эти проблемы, я был бы признателен.
Спасибо и извините за дерьмовое написание.