无法使用标识符 Y (NSInternalInconsistencyException) 将类型 X 的视图出列

Posted

技术标签:

【中文标题】无法使用标识符 Y (NSInternalInconsistencyException) 将类型 X 的视图出列【英文标题】:Could not dequeue a view of kind X with identifier Y (NSInternalInconsistencyException) 【发布时间】:2017-03-08 15:20:39 【问题描述】:

我有两个集合视图,第一个没有第二个工作正常。 但是当我添加第二个集合视图时,我收到了这个错误:

2017-03-08 18:38:28.756 kashanmap[1395:16000] *** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.6.21/UICollectionView.m:4971
2017-03-08 18:38:28.769 kashanmap[1395:16000] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier cellContentAJob - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010a2e5d4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010992621e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010a2e9e42 +[NSException raise:format:arguments:] + 98
    3   Foundation                          0x00000001094bb66d -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195
    4   UIKit                               0x000000010b76f44c -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:] + 2176
    5   UIKit                               0x000000010b76f8ea -[UICollectionView dequeueReusableCellWithReuseIdentifier:forIndexPath:] + 169
    6   kashanmap                           0x0000000108bc4643 _TFC9kashanmap25ContentAJobViewController14collectionViewfTCSo16UICollectionView13cellForItemAtV10Foundation9IndexPath_CSo20UICollectionViewCell + 211
    7   kashanmap                           0x0000000108bc54a7 _TToFC9kashanmap25ContentAJobViewController14collectionViewfTCSo16UICollectionView13cellForItemAtV10Foundation9IndexPath_CSo20UICollectionViewCell + 87
    8   UIKit                               0x000000010b75a75f -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:isFocused:notify:] + 467
    9   UIKit                               0x000000010b75a586 -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:] + 35
    10  UIKit                               0x000000010b75fa5e -[UICollectionView _updateVisibleCellsNow:] + 4803
    11  UIKit                               0x000000010b765725 -[UICollectionView layoutSubviews] + 313
    12  UIKit                               0x000000010aee1ab8 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1237
    13  QuartzCore                          0x0000000111f76bf8 -[CALayer layoutSublayers] + 146
    14  QuartzCore                          0x0000000111f6a440 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
    15  QuartzCore                          0x0000000111f6a2be _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
    16  QuartzCore                          0x0000000111ef8318 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 280
    17  QuartzCore                          0x0000000111f253ff _ZN2CA11Transaction6commitEv + 475
    18  UIKit                               0x000000010ae477f0 _afterCACommitHandler + 346
    19  CoreFoundation                      0x000000010a28a267 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    20  CoreFoundation                      0x000000010a28a1d7 __CFRunLoopDoObservers + 391
    21  CoreFoundation                      0x000000010a26ef8e __CFRunLoopRun + 1198
    22  CoreFoundation                      0x000000010a26e884 CFRunLoopRunSpecific + 420
    23  GraphicsServices                    0x0000000111e59a6f GSEventRunModal + 161
    24  UIKit                               0x000000010ae1cc68 UIApplicationMain + 159
    25  kashanmap                           0x0000000108bd0fcf main + 111
    26  libdyld.dylib                       0x000000010e10f68d start + 1
    27  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

第一个集合视图:collection_options

第二个集合视图:collection_contactus

自定义单元格类:

class CellContactUsCollectionViewCell: UICollectionViewCell 

    @IBOutlet weak var img_view_cell_contact_us: UIImageView!

    @IBOutlet weak var label_view_cell_contact_us: UILabel!


全班同学:

import UIKit
import ImageSlideshow

class ContentAJobViewController: UIViewController , UICollectionViewDataSource, UICollectionViewDelegate

    @IBOutlet weak var image_slider: ImageSlideshow!
    var job_id = "0"
    let db = DatabaseManager()
    var jobs = [GlobalHelper]()
    var job = GlobalHelper()


    @IBOutlet weak var label_title: UILabel!

    @IBOutlet weak var collection_options: UICollectionView!

    @IBOutlet weak var collection_contactus: UICollectionView!


    let reuseIdentifier             = "cellContentAJob"
    let reuseIdentifierContactUs    = "cell_content_a_job_contact_us"

    var item_options    = [String]()
    var item_contact_us = [GlobalHelper]()

    override func viewDidLoad() 
        super.viewDidLoad()

        initialValues()
    

    func initialValues()
    
        db.openDatabase()

        collection_options!.dataSource = self
        collection_options!.delegate = self

        collection_contactus!.dataSource = self
        collection_contactus!.delegate = self


        self.image_slider.contentScaleMode = UIViewContentMode.scaleAspectFill
        jobs = db.getContentAJob(id: job_id)
        job  = jobs[0]

        var arr_imgs = job.images.components(separatedBy: ",")
        var images = [InputSource]()
        for img in arr_imgs
        
            let alamofireSource = AlamofireSource(urlString: img)!
            images.append(alamofireSource)
        


        self.image_slider.setImageInputs(images)

        label_title.text = job.title

        self.image_slider.bringSubview(toFront:label_title)


        initialOptions()
        //initialContactUs()
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func initialOptions()
    

        self.image_slider.bringSubview(toFront:collection_options)



        if(self.job.wifi == "1")
        
            self.item_options.append("wififree")
        

        if(self.job.apple_health == "1")
        
            self.item_options.append("sib_noghrei")
        
        if(self.job.wc == "1")
        
            self.item_options.append("wc")
        

        if(self.job.full_time == "1")
        
            self.item_options.append("fulltime")

        

        if(self.job.pos == "1")
        
            self.item_options.append("pos")
        

        if(self.job.parking == "1")
        
            self.item_options.append("parking")
        


        DispatchQueue.main.async
        self.collection_options.reloadData()

        


    

    func initialContactUs()
    


    





    // MARK: - UICollectionViewDataSource protocol

    // tell the collection view how many cells to make
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 

        if(collectionView == collection_options)
        
           return self.item_options.count
        

        if(collectionView == collection_contactus)
        
            return 1 //return self.item_contact_us.count
        

        return 0;

    

    // make a cell for each cell index path
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 


        var cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! CellContentAJobCollectionViewCell
        print("1")
        if(collectionView == collection_options)
        
            print("collection_options")
            cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! CellContentAJobCollectionViewCell

            let image_name = self.item_options[indexPath.row]
            cell.img_view_cell_options.image = UIImage(named: image_name as! String)

            return cell
        

        print("2")
        if(collectionView == collection_contactus)
        
            print("collection_contactus")
            let cell1 = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifierContactUs, for: indexPath as IndexPath) as! CellContactUsCollectionViewCell

            let image_name = "tele"//self.item_contact_us[indexPath.row].images
            cell1.img_view_cell_contact_us.image = UIImage(named: image_name as! String)
            cell1.label_view_cell_contact_us.text = "self.item_contact_us[indexPath.row].title"

            return cell1
        
        print("3")
        return cell;



    




【问题讨论】:

检查collection_options 有正确的重用单元格和标识符。 情节提要中可能没有标识符为cellContentAJob 的单元格。顺便说一句:这不是 javascript/php。 Swift 命名约定是驼峰式 (collectionOptions)。 控制台上是否打印了“collection_contactus”?您是否正确设置了两个集合视图的出口连接? @DrummerB 这是我所有的控制台日志。 我将标识符的名称更改为cellContentAJobContactUs,但出现了同样的错误。 【参考方案1】:

我将 collectionView 函数内部的代码更改为:

if(collectionView == collection_options)



    var cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! CellContentAJobCollectionViewCell
    cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! CellContentAJobCollectionViewCell

    let image_name = self.item_options[indexPath.row]
    cell.img_view_cell_options.image = UIImage(named: image_name as! String)

    return cell



else


    print("collection_contactus")
    let cell1 = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifierContactUs, for: indexPath as IndexPath) as! CellContactUsCollectionViewCell

    let image_name = "tele"//self.item_contact_us[indexPath.row].images
        cell1.img_view_cell_contact_us.image = UIImage(named: image_name as! String)
        cell1.label_view_cell_contact_us.text = "self.item_contact_us[indexPath.row].title"



    return cell1

【讨论】:

以上是关于无法使用标识符 Y (NSInternalInconsistencyException) 将类型 X 的视图出列的主要内容,如果未能解决你的问题,请参考以下文章

我的自定义框架崩溃'无法在捆绑包中加载 NIB

如何更改之前选择的ios开发团队

exp/imp 导入导出数据库 报错:ORA-12154: TNS: 无法解析指定的连接标识符

我正在尝试创建多个循环,但是如果一个循环返回null,则不会运行其余的循环。我该如何解决?

ztree怎么设置点击节点展开

visual C++ vector 未声明的标识符,程序如下,声明没什么错误啊 为什么会这样。