为什么我不能将颜色数组中的颜色随机设置为tableViewCells?

时间:2016-05-04 10:12:47

标签: ios arrays swift uitableview uicolor

任何人都可以看到为什么我无法将tableView单元格的背景颜色属性设置为我在ViewDidLoad()中创建的数组中的颜色?我的self.tableView.reloadData()方法中也有viewDidAppear()。让我知道。

override func viewDidLoad() {
    super.viewDidLoad()

    colorArray += [UIColor.whiteColor(), UIColor.blackColor(), UIColor.greenColor(), UIColor.yellowColor(), UIColor.redColor(), UIColor.purpleColor(), UIColor.orangeColor(), UIColor.blueColor(), UIColor.brownColor(), UIColor.darkGrayColor(), UIColor.lightGrayColor(), UIColor.grayColor(), UIColor.cyanColor(), UIColor.magentaColor(), UIColor.clearColor()]

} 

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

    for color in colorArray {
        cell.backgroundColor = color
    }

    return cell
}

5 个答案:

答案 0 :(得分:1)

您正在重复设置单元格的颜色。

每次表视图要加载新单元格时,它都会调用其数据源“tableView(:cellForViewAtIndexPath:)方法”。

在此方法的实现中,循环遍历数组并将单元格的颜色设置为数组的每个项目。首先它将是白色,然后是黑色,然后是绿色......最后它被设置为clearColor,这是透明的。

每次调用该方法时,您的单元格颜色都将设置为透明。好难过!

通过查看您的代码,我认为您想要的是将第一个单元格的颜色设置为白色,第二个单元格设置为黑色,第三个单元格设置为绿色等等。

您应该知道,每次调用tableView(:cellForRowAtIndexPath:)时,它都会为您提供一个indexPath参数,告诉您它想要哪个单元格。您只需要使用它来实现您的方法:

// replace your for loop with this
cell.backgroundColor = colorArray[indexPath.row]

这样,当它想要第一个单元格时,将单元格设置为第一种颜色。当它想要第二个单元格时,将单元格设置为第二种颜色等。

另一方面,如果你想从colorArray中随机选择,那么每次加载表格视图时单元格都会不同,你只需要生成一个随机数并调用{{{1}的下标。 1}}用这个号码:

colorArray

第1行生成0到// replace your for loop with this let randomNumber = arc4random_uniform(UInt32(colorArray.count)) // line 1 cell.backgroundColor = colorArray[randomNumber] // line 2 之间的随机数。第2行只是将单元格的颜色设置为colorArray.count的索引处的颜色!

直截了当,对吧?

编辑:有关colorArray

的更多信息

你一定想知道这个arc4random_uniform函数在这里做了什么。

arc4random_uniform返回0(包括)和参数(不包括)之间的随机数(均匀分布)。换句话说,arc4random_uniform将返回0,1,2,3,4但不返回5.

该函数采用arc4random_uniform(5)类型的参数,因此我无法直接传入UInt32

答案 1 :(得分:0)

设置单元格的随机背景。工作守则。这里arc4random_uniform()随机数0到colorArray.count。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    cell.backgroundColor = colorArray[arc4random_uniform(colorArray.count)]
    return cell
}

答案 2 :(得分:0)

这将在每次循环中的最后一次UIColor时设置,

    for color in colorArray {
    cell.backgroundColor = color
}

所以,你需要通过indexPath.row(或section)得到它:

cell.backgroundColor = colorArray[indexPath.row]

或者像这样随机获取:

let randomInt = Int(rand()) % array.count
cell.backgroundColor = colorArray[randomInt]

答案 3 :(得分:0)

试试这段代码,

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

        cell.backgroundColor = self.colors[indexPath.row % self.colors.count]

        return cell
    }

希望它有用

答案 4 :(得分:0)

这不起作用,因为每个单元格都会调用一次tableView(cellForRowAtIndexPath)。

现在发生的事情是你的cell.backgroundColor被设置为第一种颜色,然后是第二种颜色,等等。所以backgroundColor总是colorArray中最后一个元素的颜色。

使用此代替for-in循环:

cell.backgroundColor = colorArray[indexPath.row]

如果tableView中的单元格数多于数组中的颜色,请使用: (当colorArray.count

时,这将再次从0开始
override func viewDidLoad() {
    super.viewDidLoad()

    colorArray += [UIColor.whiteColor(), UIColor.blackColor(), UIColor.greenColor(), UIColor.yellowColor(), UIColor.redColor(), UIColor.purpleColor(), UIColor.orangeColor(), UIColor.blueColor(), UIColor.brownColor(), UIColor.darkGrayColor(), UIColor.lightGrayColor(), UIColor.grayColor(), UIColor.cyanColor(), UIColor.magentaColor(), UIColor.clearColor()]

} 

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

    let cycle = i / colorArray.count
    let colorIndex = i - (cycle * colorArray.count)

    cell.backgroundColor = colorArray[colorIndex]

    return cell
}