Swift:点击一个单元格时更改所有UITableViewCells的文本颜色

时间:2015-06-30 01:20:14

标签: ios swift uitableview

我在Swift for iOS中有一个UITableView,它一次只允许选择一个单元格。我进行了设置,以便在选中和未选中之间进行切换,长按可将其设置为永久选中,这意味着在加载视图时默认选择启动。我很难保持牢房的细胞。当单元格超出scrollview可见部分的边界然后重新进入时,标签着色,因此我使用我的数据模型来跟踪选择和永久选择的单元格。通过这样做,我绕过了苹果公司通过选择"单一选择"制作桌面视图只允许单个单元格选择的方式。在界面构建器中。现在我正在尝试构建我自己的功能,以便在轻触另一个单元格时更改屏幕上可见的所有单元格的颜色。我正在尝试通过在点击每个单元格时循环遍历每个单元格并在该自定义单元格上调用将更改文本颜色的方法来执行此操作。问题是,它不起作用。如果我将细胞移出可见的滚动区域然后再返回,细胞将被正确着色,但如果我选择一个细胞,然后选择另一个细胞,则第一个细胞在可见时不会改变颜色。 / p>

这是我的代码。我删除了一些无关紧要的代码,所以如果还有其他你想看到的内容,请告诉我。

import Foundation
import UIKit

class AddDataViewController : UIViewController {

    @IBOutlet weak var locationTableView: UITableView!

    let locationTableViewController = LocationTableViewController()

    override func viewWillAppear(animated: Bool) {
        // Set the data source and delgate for the tables
        self.locationTableView.delegate = self.locationTableViewController
        self.locationTableView.dataSource = self.locationTableViewController

        // Refresh the tables
        self.locationTableView.reloadData()

        // Add the table view controllers to this view
        self.addChildViewController(locationTableViewController)
    }

    override func viewDidLoad(){

        super.viewDidLoad()

        // Create a tap gesture recognizer for dismissing the keyboard
        let tapRecognizer = UITapGestureRecognizer()

        // Set the action of the tap gesture recognizer
        tapRecognizer.addTarget(self, action: "dismissKeyboard")

        // Update cancels touches in view to allow touches in tableview to be detected
        tapRecognizer.cancelsTouchesInView = false

        // Add the tap gesture recognizer to the view
        self.view.addGestureRecognizer(tapRecognizer)
    }

}

class LocationTableViewController : UITableViewController, UITableViewDelegate, UITableViewDataSource {

    var locationSelected : String = ""

    func colorAllCells() {
        for section in 0 ... self.tableView.numberOfSections() - 1 {
            for row in 0 ... self.tableView.numberOfRowsInSection(section) - 1 {
                if row != 0 {
                    let indexPath = NSIndexPath(forRow: row, inSection: section)
                    let cell = self.tableView.cellForRowAtIndexPath(indexPath) as! PlayerLocationCell
                    cell.indexPath = indexPath.row - 1
                    cell.setCellColor()
                }
             }
        }
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        if indexPath.row != 0 {
            // Color all of the cells
            self.colorAllCells()
        }
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = PlayerLocationCell(style: UITableViewCellStyle.Value2, reuseIdentifier: "addDataCell")

        cell.selectionStyle = UITableViewCellSelectionStyle.None       

        if indexPath.row != 0 {
            cell.textLabel!.text = pokerLibrary.currentLog.locationList[indexPath.row - 1].name
            cell.indexPath = indexPath.row - 1
            cell.setCellColor()
        }

        return cell
    }
}

class PlayerLocationCell : UITableViewCell {

    let selectedColor = UIColor.greenColor()
    let deselectedColor = UIColor.grayColor()
    let permanentlySelectedColor = UIColor.blueColor()
    var shouldHighlightText : Bool = true
    var indexPath : Int = 0

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "cellPressed")
        longPressRecognizer.minimumPressDuration = 1.0
        longPressRecognizer.cancelsTouchesInView = false
        self.addGestureRecognizer(longPressRecognizer)

        let tapRecognizer = UITapGestureRecognizer(target: self, action: "cellTapped")
        tapRecognizer.cancelsTouchesInView = false
        self.addGestureRecognizer(tapRecognizer)
    }

    func setCellColor() {
        if shouldHighlightText {
            if self.isPermanentlySelected() {
                self.textLabel!.textColor = self.permanentlySelectedColor
            }
            else if self.isCurrentlySelected() {
                self.textLabel!.textColor = self.selectedColor
            }
            else {
                self.textLabel!.textColor = self.deselectedColor
            }
        }
    }

    func cellTapped() {
        if shouldHighlightText {
            self.setPermanentlySelected(false)

            if self.isCurrentlySelected() {
                self.setSelectedProperty(false)
                self.setCellColor()
            }
            else {
                self.setSelectedProperty(true)
                self.setCellColor()
            }
        }
    }

    func cellPressed() {
        if self.shouldHighlightText {
            if !self.isPermanentlySelected() {
                self.setPermanentlySelected(true)
                self.setCellColor()
            }
        }
    }

    func setPermanentlySelected(b : Bool) {
        if b {
            // Set all other locations to false
            for i in 0 ... pokerLibrary.currentLog.locationList.count - 1 {
                pokerLibrary.currentLog.locationList[i].selected = false
                pokerLibrary.currentLog.locationList[i].permanentlySelected = false
            }
        }
        pokerLibrary.currentLog.locationList[self.indexPath].permanentlySelected = b
    }

    func isPermanentlySelected() -> Bool {
        return pokerLibrary.currentLog.locationList[self.indexPath].permanentlySelected
    }

    func setSelectedProperty(b : Bool) {
        if b {
            // Set all other locations to false
            for i in 0 ... pokerLibrary.currentLog.locationList.count - 1 {
                pokerLibrary.currentLog.locationList[i].selected = false
                pokerLibrary.currentLog.locationList[i].permanentlySelected = false
            }
        }
        pokerLibrary.currentLog.locationList[self.indexPath].selected = b
    }

    func isCurrentlySelected() -> Bool {
        return pokerLibrary.currentLog.locationList[self.indexPath].selected
    }

}

如您所见,我目前正在didSelectRowAtIndexPath方法中调用LocationTableViewController的colorAllCells方法。 colorAllCells方法循环遍历所有单元格并调用每个单元格的setCellColor方法,该方法将确定单元格颜色应该是什么并设置文本颜色。我已经验证了每个单元格都有从循环中调用的setCellColor方法,并且正确地确定要设置的颜色。颜色不会改变。我已经尝试在遍历每个单元格并设置颜色之后调用self.tableView.reloadData(),但这也没有用。

感谢您对此问题的任何帮助。如果您需要我澄清任何事情,请告诉我。谢谢!

3 个答案:

答案 0 :(得分:2)

我终于找到了解决方案。如果我在调用tableView.cellForRowAtIndexPath之前删除对self的引用,并且我将colorAllCells方法中的代码移动到didSelectRowAtIndexPath方法中,那么它就可以工作。

robots.php

此解决方案有效。但是,当我将代码放在didSelectRowAtIndexPath方法中时,我不明白它为什么会起作用,但是如果我把那个代码拿出来放在它自己的函数中然后调用那个函数,它就不起作用了。有谁知道为什么会这样?

答案 1 :(得分:1)

您需要一些方法来管理视图控制器中的单元格选择状态。我会用Set这样做:

class LocationTableViewController: UITableViewController {

    var selectedIndexPaths = Set<NSIndexPath>()

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        self.selectedIndexPaths.insert( indexPath )

        if let cell = tableView.cellForRowAtIndexPath( indexPath ) as? PlayerLocationCell {
            // Change color of the existing cell
        }
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        if let cell = tableView.dequeueReusableCellWithIdentifier( "addDataCell" )as? PlayerLocationCell {

            if self.selectedIndexPaths.contains( indexPath ) {
                // Change color of the cell just dequeued/created
            }
            return cell
        }
        fatalError( "Could not dequeue cell of type 'PlayerLocationCell'" )
    }
}

此外,您应该使用dequeueReusableCellWithIdentifier:重复使用表格视图单元格,而不是在tableView:cellForRowAtIndexPath方法中创建新的单元格。

答案 2 :(得分:0)

尝试在主线程上调用awk函数。

while IFS= read -r line
do
    echo $line|awk -F':' '/jobId/{split($2,a,",");for(i in a){if(a[i]){printf("%d\n",a[i])}}}'
done < "$file"

但这会阻止你的用户界面。