Как создать такой же случайный цвет в табличном представлении для строки табличного представления для другой строки табличного представления? - PullRequest
0 голосов
/ 04 апреля 2019

В моем приложении я нажимаю на строку, и она расширяет еще одну строку под ним.Я хочу создать случайный цвет, чтобы при нажатии на строку фон строки изменял этот цвет, а расширенная строка под ним - того же цвета.Как получить строки для генерации одного и того же случайного цвета?

Я создал функцию для генерации случайного цвета и вызываю ячейку функции для строки, когда для isOpened установлено значение true, и я вызываю ту же функцию дляклетка, которая расширена.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {  
    let dataIndex = indexPath.row - 1  
    guard let cell1 = tableView.dequeueReusableCell(withIdentifier: "cell1") else {return UITableViewCell()}  

    func generateRandomColor() -> UIColor {  
        let redValue = CGFloat(drand48())  
        let greenValue = CGFloat(drand48())  
        let blueValue = CGFloat(drand48())  

        let randomColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)  

        return randomColor  
    }  

    if indexPath.row == 0 {  
        if tableViewData[indexPath.section].opened == false {  
            tableViewData[indexPath.section].opened = false  
            cell1.textLabel?.text = tableViewData[indexPath.section].title  
            cell1.textLabel?.numberOfLines = 0  
            cell1.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping  
            cell1.textLabel?.font = UIFont.systemFont(ofSize: 18)  
            cell1.backgroundColor = UIColor.clear  
            return cell1  
        }  
        else if tableViewData[indexPath.section].opened == true {  
            tableViewData[indexPath.section].opened = true  
            cell1.textLabel?.text = tableViewData[indexPath.section].title  
            cell1.textLabel?.numberOfLines = 0  
            cell1.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping  
            cell1.textLabel?.font = UIFont.boldSystemFont(ofSize: 25)  
            cell1.backgroundColor = generateRandomColor()  
            return cell1  
        }  
        return cell1  
    } else {  
        cell1.textLabel?.text = tableViewData[indexPath.section].sectionData[dataIndex]  
        cell1.textLabel?.numberOfLines = 0  
        cell1.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping  
        cell1.textLabel?.font = UIFont.systemFont(ofSize: 18)  
        cell1.backgroundColor = generateRandomColor()  
        return cell1  
    }  
}  

Произвольный цвет генерируется, но расширенная строка генерирует новый цвет.

Ответы [ 4 ]

2 голосов
/ 04 апреля 2019

Вам нужно будет сохранить сгенерированные случайные цвета. Каждый раз, когда вы вызываете generateRandomColor (), создается новый. То, что я хотел бы сделать, это создать словарь строк для цветов.

var color: [Int: UIColor?] = [:]

Затем в cellForRowAtIndexPath определите, есть ли у вас цвет для этой строки, а если нет, то вычислите его:

if let color = colors[indexPath.row] {
    cell.backgroundColor = color
} else {
    colors[indexPath.row] = generateRandomColor()
}

Затем в didSelectRowForIndexPath вы можете получить randomColor, используя:

if let color = colors[indexPath.row] {
        // Expand the cell with the new color
}
0 голосов
/ 05 апреля 2019

Я перепробовал все эти методы и нашел только один, который работал так, как я хотел.

Мне пришлось изменить мой источник данных:

struct cellData {
var opened = Bool()
var title = String()
var sectionData = [String]()
var color: UIColor? = UIColor()

}

var tableViewData = [cellData]()

func generateRandomColor() -> UIColor {
let redValue = CGFloat(drand48())
let greenValue = CGFloat(drand48())
let blueValue = CGFloat(drand48())

let randomColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)

return randomColor
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let dataIndex = indexPath.row - 1
    guard let cell1 = tableView.dequeueReusableCell(withIdentifier: "cell1") else {return UITableViewCell()}

    var backgroundColor: UIColor! = tableViewData[indexPath.section].color
    if backgroundColor == nil {
        backgroundColor = generateRandomColor()
        tableViewData[indexPath.section].color = backgroundColor
    }
    cell1.backgroundColor = backgroundColor

    if indexPath.row == 0 {

        if tableViewData[indexPath.section].opened == false {
            tableViewData[indexPath.section].opened = false
            cell1.textLabel?.text = tableViewData[indexPath.section].title
            cell1.textLabel?.numberOfLines = 0
            cell1.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping
            cell1.textLabel?.font = UIFont.systemFont(ofSize: 18)
            cell1.backgroundColor = UIColor.clear
            return cell1
        }
        else if tableViewData[indexPath.section].opened == true {
            tableViewData[indexPath.section].opened = true
            cell1.textLabel?.text = tableViewData[indexPath.section].title
            cell1.textLabel?.numberOfLines = 0
            cell1.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping
            cell1.textLabel?.font = UIFont.boldSystemFont(ofSize: 25)
            return cell1
        }
        return cell1
    } else {
        cell1.textLabel?.text = tableViewData[indexPath.section].sectionData[dataIndex]
        cell1.textLabel?.numberOfLines = 0
        cell1.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping
        cell1.textLabel?.font = UIFont.systemFont(ofSize: 18)
        return cell1
    }
}
0 голосов
/ 04 апреля 2019

Измените источник данных вашего раздела, включив в него цвет, например:

struct SectionData {
    let title: String
    var color: UIColor?
}

Непосредственно перед строкой if indexPath.row == 0 { добавить следующее

var backgroundColor: UIColor! = self.tableViewData[indexPath.section].color
if backgroundColor == nil {
    backgroundColor = generateRandomColor()
    self.tableViewData[indexPath.section].color = backgroundColor
}
cell1.backgroundColor = backgroundColor

Теперь УДАЛИТЕ другие строки cell1.backgroundColor = generateRandomColor()

0 голосов
/ 04 апреля 2019

Вставить артер локальный функционал: let _color = generateRandomColor () Этому значению можно присвоить элементы, которые должны иметь одинаковый цвет.

...