以编程方式添加 UICollectionView 时应用程序崩溃

Posted

技术标签:

【中文标题】以编程方式添加 UICollectionView 时应用程序崩溃【英文标题】:App Crash while adding the UICollectionView programmatically 【发布时间】:2017-10-05 09:59:13 【问题描述】:

我正在尝试在我的项目中以编程方式添加带有自定义 UICollectionViewCell 的 UICollectionView。

这是我添加 CollectionView 的实现

- (void)setUpCollectionView
    UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
    layout.scrollDirection = UICollectionViewScrollDirectionVertical;
    [layout setMinimumLineSpacing:1];
    [layout setMinimumInteritemSpacing:1];
    [layout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    [layout setScrollDirection:UICollectionViewScrollDirectionVertical];

    self.collectionView =[[UICollectionView alloc] initWithFrame:self.vwChecklistsContainer.frame collectionViewLayout:layout];
    [self.collectionView setDataSource:self];
    [self.collectionView setDelegate:self];

    UINib *cellNib = [UINib nibWithNibName:@"MyChecklistsCell" bundle:nil];
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"MyChecklistsCell"];
    [self.vwChecklistsContainer addSubview:self.collectionView];

这个“setUpCollectionView”函数是从我的视图控制器的 ViewDidLoad() 调用的。

我刚刚在 MyChecklistsCell 中实现了这两个功能。

- (void)awakeFromNib 
     [super awakeFromNib];
    // Initialization code


- (void)setData:(NSDictionary *)dict
    self.lblChecklistType = dict[SERVER_CHECKLIST_TYPE];
    self.lblEndTime = dict[SERVER_END_TIME];
    self.lblStartTime = dict[SERVER_START_TIME];
    self.lblDescription = dict[SERVER_DESCRIPTION];

谁能帮我解决这个问题?谢谢。

【问题讨论】:

“应用程序崩溃”:错误信息是什么? @Larme 仅显示此错误消息“-[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000000043” @NyeinEiEiTun setData 方法中的问题 哪一行?这个问题出现在setData: 上并不让我感到惊讶。我猜? value = dict[oneOfMoreOfThesesKey]NSNumber 而不是 NSString 它甚至没有进入“setData”。此行“[self.vwChecklistsContainer addSubview:self.collectionView];”后应用程序崩溃 【参考方案1】:

试试这个。

- (void)setData:(NSDictionary *)dict
        self.lblChecklistType = [NSString stringWithFormat:@"%@",dict[SERVER_CHECKLIST_TYPE]];
        self.lblEndTime = [NSString stringWithFormat:@"%@",dict[SERVER_END_TIME]]; ;
        self.lblStartTime = [NSString stringWithFormat:@"%@",dict[SERVER_START_TIME]]; ;
        self.lblDescription = [NSString stringWithFormat:@"%@",dict[SERVER_DESCRIPTION]];
  

错误表明您正在对 NSNumber 使用 NSString 方法。请检查您的数据是否为字符串。

希望对你有帮助。

【讨论】:

奇怪!委托函数“cellForItemAtIndexPath”甚至没有被触发。因为我在该委托中调用了 setData 函数。在这行“[self.vwChecklistsContainer addSubview:self.collectionView];”之后我崩溃了来自“setUpCollectionView”函数。 终于找到问题的根源了。你是对的。在将数据设置为 UICollectionView 之前,我需要从 myViewController 的视图将数据设置为标签。当我将数据设置到我的 ViewController 时,我还没有将值转换为字符串。这就是我得到错误的原因。谢谢你的回答。【参考方案2】:

看起来您正在尝试将标签设置为 NSNumber。这里的问题是使用字典来保存您的数据而无需任何类型检查。考虑使用对象而不是字典来存储数据。这将使您更清楚地尝试设置哪些属性并避免将来出现问题。

或者,您评论的错误消息似乎只引用了一个内存地址,而不是一个可能表明您没有正确保留集合视图或其他属性的对象 - 您是否仔细检查了所有引用是否正确强/弱?

【讨论】:

奇怪!委托函数“cellForItemAtIndexPath”甚至没有被触发。因为我在该委托中调用了 setData 函数。在这行“[self.vwChecklistsContainer addSubview:self.collectionView];”之后我崩溃了来自“setUpCollectionView”函数。 终于找到问题的根源了。你是对的。在将数据设置为 UICollectionView 之前,我需要从 myViewController 的视图将数据设置为标签。当我将数据设置到我的 ViewController 时,我没有将值转换为字符串。这就是我得到错误的原因。谢谢你的回答。

以上是关于以编程方式添加 UICollectionView 时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将子视图添加到 UICollectionView

以编程方式将 UIButtons 添加到 UICollectionView 单元格的 uiimage

UICollectionView 以编程方式添加到 UITableViewCell 中,但没有出现?

有没有办法以编程方式向 UICollectionView 单元格添加填充?

以编程方式使用自动布局将子视图添加到 UICollectionView 不起作用

在 Swift 中以编程方式在 UITableViewCell 中创建一个 UICollectionView