草庐IT

ios - uitableviewcell 滚动内的 uicollectionview 将因索引超出范围而崩溃

coder 2023-09-16 原文

我在 UITableViewCell 中学习了 UICollectionView from this tutorial .

它仅在所有 Collection View 具有相同的 numberOfItemsInSection 时才能完美运行,因此它可以滚动并且不会导致索引超出范围错误,但是如果 Collection View 单元格 numberOfItemsInSection 不同,当我滚动 Collection View 时,它会因索引超出范围而崩溃。

我找到了原因,当我滚动 tableview 时, Collection View 单元格索引路径根据底部的更新,但我滚动的 Collection View 是顶部的,所以它不记得 numberOfItemsInSection,因此它会因索引超出范围而崩溃。

ps:它是可滚动的,但只有当底部的那个表格单元格时,因为它的 numberOfItemsInSection 是对应那个单元格的,不会导致 Index out of range .

这是我的 CollectionView 的 numberOfItemsInSection,我实际上有两个 Collection View ,但我认为这不是问题

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        var numberOfItemsInSection: Int = 0

        if collectionView == self.collectionview_categorymenu {
            let categories = self.json_menucategory["menu_categories"].arrayValue
            numberOfItemsInSection = categories.count
        } else {
            let menuitems = self.json_menucategory["menu_items"].arrayValue
            let item_data = menuitems[self.itemimages_index].dictionaryValue
            let menu_item_images = item_data["menu_item_images"]?.arrayValue
            numberOfItemsInSection = (menu_item_images?.count)!
            print(numberOfItemsInSection)
        }

        return numberOfItemsInSection
    }

这是我的 CollectionView 的 cellForItemAt indexPath:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        if collectionView == self.collectionview_categorymenu {

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoryMenuCell", for: indexPath) as! CategoryMenuCell

            return cell
        } else {

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ItemImagesCell", for: indexPath) as! ItemImagesCell

            let menuitems = self.json_menucategory["menu_items"].arrayValue

            let item_data = menuitems[self.itemimages_index].dictionaryValue

            let menu_item_images = item_data["menu_item_images"]?.arrayValue


            print(menu_item_images!)
            let itemimage_data = menu_item_images?[indexPath.item].dictionaryValue
            print("===\(indexPath.item)===")

            let itemimage_path = itemimage_data?["image"]?.stringValue
            let itemimage_detail = itemimage_data?["detail"]?.stringValue


            if let itemimage = cell.imageview_itemimage {
                let image_url = itemimage_path?.decodeUrl()
                URLSession.shared.dataTask(with: NSURL(string: image_url!) as! URL, completionHandler: { (data, response, error) -> Void in

                    if error != nil {
                        print("error")
                        return
                    }
                    DispatchQueue.main.async(execute: { () -> Void
                        in

                        itemimage.image = UIImage(data: data!)!
                    })
                }).resume()
            }

            if let description = cell.textview_description {
                description.text = itemimage_detail
            }

            if let view = cell.view_description {
                view.isHidden = true
            }

            return cell
        }

    }

最佳答案

问题可能是您每次为 numberOfItemsInSection 返回相同的数字,您想要做的是返回每个数组中的项目数。他们通过您发送的链接执行此操作:

func collectionView(collectionView: UICollectionView, 
    numberOfItemsInSection section: Int) -> Int {

    return model[collectionView.tag].count
}

另一种可能是当 cellForItemAtIndexPath 时您返回了错误的数组,请检查您是否正确使用了标签属性

所以他们得到模型中每个数组的计数。如果没有看到您的任何代码,就很难真正看出您的错误来自何处。

关于ios - uitableviewcell 滚动内的 uicollectionview 将因索引超出范围而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40460784/

有关ios - uitableviewcell 滚动内的 uicollectionview 将因索引超出范围而崩溃的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  6. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  8. ruby - 如何在ruby中提取方括号内的内容 - 2

    我正在尝试提取方括号内的内容。到目前为止,我一直在使用它,它有效,但我想知道我是否可以直接在正则表达式中使用某些东西,而不是使用这个删除功能。a="Thisissuchagreatday[coolawesome]"a[/\[.*?\]/].delete('[]')#=>"coolawesome" 最佳答案 差不多。a="Thisissuchagreatday[coolawesome]"a[/\[(.*?)\]/,1]#=>"coolawesome"a[/(?"coolawesome"第一个依赖于提取组而不是完全匹配;第二个利用前瞻和

  9. ruby - block 内的实例评估 - 2

    我有一个Builder类,可让您添加到其中一个实例变量:classBuilderdefinitialize@lines=[]enddeflinesblock_given??yield(self):@linesenddefadd_line(text)@lines现在,我该如何改变它my_builder=Builder.newmy_builder.lines{|b|b.add_line"foo"b.add_line"bar"}pmy_builder.lines#=>["foo","bar"]进入这个?my_builder=Builder.newmy_builder.lines{add_li

  10. ruby - 打印一个范围内的数字 - 2

    我正在尝试使用以下代码打印1到50之间的所有数字:[1..50].each{|n|putsn}但是控制台打印[1..50]我想打印这样的东西1个2个3个4个...50 最佳答案 试试下面的代码:(1..50).each{|n|putsn}问题是您使用的是[]定界符而不是()定界符。 关于ruby-打印一个范围内的数字,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/14528573

随机推荐