如何比较两个不同大小的数组并根据比较在 UICollectionviewcell 中给出颜色?

Posted

技术标签:

【中文标题】如何比较两个不同大小的数组并根据比较在 UICollectionviewcell 中给出颜色?【英文标题】:How to compare two different size array and give color in UICollectionviewcell as per compare? 【发布时间】:2016-12-25 08:31:54 【问题描述】:

我必须将下面的数组相互比较。但是我在 for 循环和cellForItemAtIndexPath 中都遇到了超出范围的错误。如何比较这些数组并在 UICollectionviewcell 中分配 3 种不同的颜色。三个数组大小不一样?


"success": 1,
"time_slots": [
"10:00",
"10:15",
"10:30",
"10:45",
"11:00",
"11:15",
"11:30",
"11:45",
"12:00",
"12:15",
"12:30",
"12:45",
"13:00",
"13:15",
"13:30",
"13:45",
"14:00",
"14:15",
"14:30",
"14:45",
"15:00",
"15:15",
"15:30",
"15:45",
"16:00",
"16:15",
"16:30",
"16:45",
"17:00",
"17:15",
"17:30",
"17:45",
"18:00",
"18:15",
"18:30",
"18:45",
"19:00",
"19:15",
"19:30",
"19:45",
"20:00",
"20:15",
"20:30",
"20:45",
"21:00",
"21:15"
],
"booked_time_slots": [

],
"blocked_time_slots": [
"18:15",
"18:30",
"18:45",
"19:00",
"19:15",
"11:15",
"11:30",
"11:45",
"12:00"
],
"staff_detail": 
    "staffId": "6",
    "fname": "James Keri",
    "image": ""
    

我的cellForRow 的以下代码中出现Index out of range 错误:

var arrayOfSlotTime = [String]()
var arrayOfBlockTime = [String]() 
let stringFirst = arrayOfSlotTime[indexPath.row] as? String
let stringSecond = arrayOfBlockTime[indexPath.row] as? String
if stringFirst == stringSecond 
    cell.contentView.backgroundColor = Constant.color.theamColor
 else  
    cell.contentView.backgroundColor = Constant.color.blue

【问题讨论】:

你在 cellForRow 方法中做什么?请分享tableViewDataSource 你已经有了答案。当数组大小不同时,您无法比较它们。 任何替代品都是黑客,需要格外小心。 请在答案中添加您的cellForRow 和 for 循环代码作为编辑,如果可能,请突出显示出现错误的行! 【参考方案1】:

你的问题是,你只是创建了两个空数组,而不是试图访问它的元素。

当你这样做时:

var arrayOfSlotTime = [String]()
var arrayOfBlockTime = [String]() 

两个数组的计数都为零,它不包含任何元素。比你这个时候:

let stringFirst = arrayOfSlotTime[indexPath.row] as? String
let stringSecond = arrayOfBlockTime[indexPath.row] as? String

您正在尝试访问元素以访问indexPath.row 的任何值。但是,您的容器是空的,其中没有任何元素,因此您会因Index out of range 错误而崩溃。

我认为arrayOfSlotTimearrayOfBlockTime 应该来自其他地方,并且肯定不应该为空。

编辑:

如果数组包含问题开头的 JSON 值,只需查看 file. time_slots 我假设是 arrayOfSlotTime 有 45 个项目,而 blocked_time_slotsarrayOfBlockTime 有 8 个项目。

当您访问值为 8 的 indexPath.row 时,arrayOfBlockTimeIndex out of range 一起崩溃,因为它包含来自 [0...7] 的元素

如果您想根据给定indexPath 处具有相同值的两个数组对单元格进行一些转换,请执行以下操作:

// Lets create the first string with the rigth indexPath value
let slotTime = arrayOfSlotTime[indexPath.row] as? String ?? ""
// Check if arrayOfBlockTime has the slotTime at the indexPath, and apply the color to a new variable 
let backgroundColor = arrayOfBlockTime.contains(slotTime) ? Constant.color.theamColor : Constant.color.blue
// Assign the background color
cell.contentView.backgroundColor = backgroundColor

【讨论】:

不不,我只是举个例子,评论空间较少。所以我认为任何人都可以想象上述数组中的给定值。“time_slots”:[] = arrayOfSlotTime 和“blocked_time_slots”:[ ] = arrayOfBlockTime 具有该值。 谢谢 danee,我得到了答案。我得到了三个不同数组的颜色。

以上是关于如何比较两个不同大小的数组并根据比较在 UICollectionviewcell 中给出颜色?的主要内容,如果未能解决你的问题,请参考以下文章

(去重)JS比较两个数组对象,取出不同的值

JAVA如何比较两数组大小

如何比较两个json的数据并根据结果在vue中显示图标?

C语言中如何限定一个数的大小,如不得大于10000

比较具有不同属性数量的两个数组,并使用javascript在条件下将第三个数组映射到比较值

比较两个数组并返回重复值