首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Swift 3- CollectionView数据源未返回有效单元格

Swift 3- CollectionView数据源未返回有效单元格
EN

Stack Overflow用户
提问于 2017-02-09 14:49:02
回答 1查看 2K关注 0票数 0

我使用的代码是:https://www.youtube.com/watch?v=bNtsekO51iQ,但是当我实现数据并使用collectionView.reloadData()时,它崩溃了,错误代码为*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'the collection view's data source did not return a valid cell from -collectionView:cellForItemAtIndexPath: for index path <NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0}'

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ChatLogController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    var userId:Int?
    var position:Int = 0
    var otherAvatar:UIImage = UIImage(named: "defaultAvatar")!
    var otherName:String = ""
    var otherSex:String = ""
    var otherBanned:Int = 0
    var otherBlocked:Int = 0
    var messagesDates:[String] = []
    var messagesText:[String] = []
    var messagesIds:[String] = []
    var messagesPics:[UIImage?] = []
    var messagesSeen:[Int] = []
    var messagesWhoSendIt:[Int] = []
    private let cellId = "cellId"
    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView?.register(ChatLogMessageCell.self, forCellWithReuseIdentifier: cellId)
        collectionView!.isPrefetchingEnabled = false
        loadChatsFor(position: position)
    }    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return messagesIds.count
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath as IndexPath) as! ChatLogMessageCell

        cell.messageTextView.text = messagesText[indexPath.row]


            cell.profileImageView.image = UIImage(named: "defaultAvatar")!

            let size = CGSize(width:250,height:1000)
            let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
            let estimatedFrame = NSString(string: messagesText[indexPath.row]).boundingRect(with: size, options: options, attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 18)], context: nil)

        cell.messageTextView.frame = CGRect(x:48 + 8, y:0, width:estimatedFrame.width + 16, height:estimatedFrame.height + 20)

        cell.textBubbleView.frame = CGRect(x:48, y:0, width:estimatedFrame.width + 16 + 8, height:estimatedFrame.height + 20)

        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            let size = CGSize(width:250,height:1000)
            let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
            let estimatedFrame = NSString(string: messagesText[indexPath.row]).boundingRect(with: size, options: options, attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 18)], context: nil)

        return CGSize(width:view.frame.width, height:estimatedFrame.height + 20)
    }


    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsetsMake(8, 0, 0, 0)
    }

}

class ChatLogMessageCell: BaseCell {

    let messageTextView: UITextView = {
        let textView = UITextView()
        textView.font = UIFont.systemFont(ofSize: 18)
        textView.text = "Sample message"
        textView.backgroundColor = UIColor.clear
        return textView
    }()

    let textBubbleView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor(white: 0.95, alpha: 1)
        view.layer.cornerRadius = 15
        view.layer.masksToBounds = true
        return view
    }()

    let profileImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFill
        imageView.layer.cornerRadius = 15
        imageView.layer.masksToBounds = true
        return imageView
    }()

    override func setupViews() {
        super.setupViews()

        addSubview(textBubbleView)
        addSubview(messageTextView)

        addSubview(profileImageView)
        addConstraintsWithFormat(format:"H:|-8-[v0(30)]", views: profileImageView)
        addConstraintsWithFormat(format:"V:[v0(30)]|", views: profileImageView)
        profileImageView.backgroundColor = UIColor.red
    }

}
extension UIView {

    func addConstraintsWithFormat(format: String, views: UIView...) {

        var viewsDictionary = [String: UIView]()
        for (index, view) in views.enumerated() {
            let key = "v\(index)"
            viewsDictionary[key] = view
            view.translatesAutoresizingMaskIntoConstraints = false
        }

        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary))
    }


}
class BaseCell: UICollectionViewCell {
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupViews()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setupViews() {
    }
}

在loadChatsFor中,我从web获取数组数据,并使用collectionView.reloadData(),但当执行此函数时,它会使我的应用程序崩溃。我一直在寻找答案,但没有成功。我已经在视图中添加了iOS10函数collectionView!.isPrefetchingEnabled = false从这个答案UICollectionView exception in UICollectionViewLayoutAttributes from iOS7加载,但也不能工作。即使是在reloadData之前和reloadData之后的collectionViewLayout invalidateLayout方法也不能阻止崩溃。那么我还能做些什么来让它工作呢?

我将从UITableViewCell进入这个CollectionViewController

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let layout = UICollectionViewFlowLayout()
    let controller = ChatLogController(collectionViewLayout: layout)
    controller.userId = chatUserIds[indexPath.row]
    navigationController?.pushViewController(controller, animated: true)
}

我已经在tableview的类中添加了UICollectionViewDelegateFlowLayout

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-09 15:03:02

您没有实现UICollectionViewDataSource的正确cellForItemAt方法。此方法的签名在Swift 3中更改如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath as IndexPath) as! ChatLogMessageCell

    cell.messageTextView.text = messagesText[indexPath.row]


    cell.profileImageView.image = UIImage(named: "defaultAvatar")!

    let size = CGSize(width:250,height:1000)
    let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
    let estimatedFrame = NSString(string: messagesText[indexPath.row]).boundingRect(with: size, options: options, attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 18)], context: nil)

    cell.messageTextView.frame = CGRect(x:48 + 8, y:0, width:estimatedFrame.width + 16, height:estimatedFrame.height + 20)

    cell.textBubbleView.frame = CGRect(x:48, y:0, width:estimatedFrame.width + 16 + 8, height:estimatedFrame.height + 20)

    return cell
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42139748

复制
相关文章
Angular 2 表单(下)
接下来我们使用 ngModel 进行双向数据绑定,通过监听 DOM 事件,来实现更新组件的属性。
陈不成i
2021/07/26
1.7K0
Angular 从入坑到挖坑 - 表单控件概览
angular 入坑记录的笔记第三篇,介绍 angular 中表单控件的相关概念,了解如何在 angular 中创建一个表单,以及如何针对表单控件进行数据校验。
程序员宇说
2020/03/19
18.9K0
【angular】Can’t bind to ‘ngModel’ since it isn’t a known property of ‘select’.
最近做前端的时候,经常会遇到Can’t bind to ‘…’ since it isn’t a known property of ‘…’,比如今天想在<select/>上加一个双向绑定,就提示Can’t bind to ‘ngModel’ since it isn’t a known property of ‘select’. 出现这个问题的原因就是没有用,所以需要先在module添加引用
全栈程序员站长
2022/08/10
8040
Angular Input和Output
Input 是属性装饰器,用来定义组件内的输入属性。在实际应用场合,我们主要用来实现父组件向子组件传递数据。Angular 应用是由各式各样的组件组成,当应用启动时,Angular 会从根组件开始启动,并解析整棵组件树,数据由上而下流下下一级子组件。
阿宝哥
2019/11/06
2.4K0
Angular 6.x 基础教程
若想进一步了解 Angular CLI 的详细信息,请参考 Angular CLI 终极指南。
阿宝哥
2019/11/05
15.6K0
Angular核心概念:数据绑定
测试:在NG表达式可以执行哪些代码?(Y表示可以,N表示不可以) 算术运算:Y。比较运算:Y。逻辑运算:Y。三目运算:Y。 调用函数:Y。创建对象:N。JSON序列化:N。 NG表达式禁止出现new关键字。NG表达式中JSON是undefined。 结果展示:
用户9857551
2022/06/28
3.6K0
Angular核心概念:数据绑定
AngularDart4.0 指南- 表单 顶
表单是商业应用程序的主流。您可以使用表单登录,提交帮助请求,下订单,预订航班,安排会议,并执行无数其他数据录入任务。
南郭先生
2018/08/14
17.5K0
AngularDart4.0 指南- 表单
                                                    顶
AngularDart4.0 英雄之旅-教程-03英雄编辑器
码云项目页:https://gitee.com/scooplolwiki/toh-1
南郭先生
2018/08/14
3.2K0
AngularDart4.0 英雄之旅-教程-03英雄编辑器
Angular 6.x 表单快速入门
本文主要介绍 Template Driven Forms (模板驱动式表单)的基础知识,相关的知识点会以问答的形式进行介绍。
阿宝哥
2019/11/05
4.7K0
AngularDart4.0 指南-体系结构概述 顶
AngularDart(我们通常在这个文档中简单地称为Angular)是一个框架,用于在HTML和Dart中构建客户端应用程序。它是作为Angular包发布的,与 其他许多Dart包一样,可以通过Pub工具获得。
南郭先生
2018/08/14
7.9K0
AngularDart4.0 指南-体系结构概述 
                                                    顶
Angular2 :从 beta 到 release4.0 版本升级总结
一、版本说明 原始版本: 2.0.0-beta.6 目标版本: 4.1.1 新增脚手架: Angular-cli 脚手架版本: 1.0.0-rc.1 升级后主要依赖版本如下: "dependenci
被删
2017/05/16
8.2K0
Angular ViewChild和ViewChildren
Angular 为我们提供 ViewChild 和 ViewChildren 装饰器来获取模板视图中匹配的元素。ViewChild 是属性装饰器,用来从模板视图中获取匹配的元素。视图查询在 ngAfterViewInit 钩子函数调用前完成,因此在 ngAfterViewInit 钩子函数中,就能正常获取查询的元素。
阿宝哥
2019/11/05
2.7K0
AngularDart4.0 指南- 模板语法二 顶
Class绑定语法类似于属性(property)绑定。 以前缀类开始,可选地跟一个点(.)和一个CSS类的名字替代括号内的元素属性:[class.class-name]。
南郭先生
2018/08/14
30K0
AngularDart4.0 指南- 模板语法二
                                                    顶
Angular学习笔记(一)
Angular 应用是模块化的,并且 Angular 有自己的模块系统,它被称为 Angular 模块 或 NgModules。 Angular 模块都是一个带有 @NgModule 装饰器的类。 NgModule 是一个装饰器函数,它接收一个用来描述模块属性的元数据对象。其中最重要的属性是:
Theo Tsao
2018/09/07
3.3K0
Angular学习资料大全和常用语法汇总(让后端程序员轻松上手)
  首先为什么要写这样的一篇文章呢?主要是因为前段时间写过一些关于Angualr的相关实战文章,有些爱学习的小伙伴对这方面比较感兴趣,但是又不知道该怎么入手(因为认识我的大多数小伙伴都是后端的同学),所以今天准备出一篇Angular学习资料汇总和日常开发中使用比较频繁的语法总结。让更多的后端程序员更好的了解学习Angualr,拓展自己的技术栈。
追逐时光者
2021/01/29
5.4K0
【Angular6+】事件绑定
添加如下 onSelect() 方法,它会把模板中被点击的英雄赋值给组件的 selectedHero 属性。
CloudCat
2019/05/26
1.6K0
AngularJS进阶(十一)AngularJS实现表格数据的编辑,更新和删除[通俗易懂]
我们来看其中一个标签,<edit>,这里呢,我们用ng-Model来绑定employee这个对象。
全栈程序员站长
2022/09/15
4.8K0
AngularJS进阶(十一)AngularJS实现表格数据的编辑,更新和删除[通俗易懂]
点击加载更多

相似问题

不推荐使用反应性形式的NgModel

19

角4材料显示formArrayName与ngFor和ngModel

14

Angular -在ngInclude内部调用时不更新ngModel

30

Angular 2 ngModel值使用离子更新不够快

04

使用FormArrayName的反应形角

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文