Swift tableView галочка повторяется при прокрутке - PullRequest
0 голосов
/ 06 января 2020

Я довольно новичок в стремлении и развитии, мне нужна помощь в решении проблемы, с которой я не могу справиться.

Так что, по сути, у меня есть куча пользовательских классов, в которых подробно описываются тренировки, я используйте эти тренировки для заполнения табличного представления, чтобы показать пользователю список упражнений в выбранной конкретной тренировке.

Я хочу иметь возможность ставить галочку рядом с упражнением в табличном представлении, как только оно будет выполнено, проблема, с которой я сталкиваюсь, заключается в том, что галочка повторяется при прокрутке, теперь я удалила ее для новых ячеек но это вызывает галочку go, когда я прокручиваю вниз, а затем назад, я понимаю, что это потому, что я снова использую ячейку. Что я не могу понять, так это как это исправить, я перепробовал все виды решений, и ни одно из них не сработало.

Любой совет будет высоко ценится!

Код ниже, спасибо you!

ps Просто для ясности navTitle передается с предыдущего V C.

import UIKit

class workoutTableView: UIViewController, UITableViewDataSource, UITableViewDelegate {


    var navTitle: String = ""
    var workout = [String]()
    let tlabel = UILabel()


    @IBOutlet weak var workoutTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        workoutTableView.delegate = self
        workoutTableView.dataSource = self
        tlabel.text = navTitle
        tlabel.textAlignment = .center
        tlabel.font = UIFont(name: "Arial Rounded MT Bold", size: 30)
        tlabel.adjustsFontSizeToFitWidth = true
        navigationItem.titleView = tlabel

    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if navTitle == "The 600 Workout" {

            workout = The600Workout().workoutArray
        }

        if navTitle == "5 Days for Muscle" {

            workout = FiveDaysForMuscle().workoutArray

        }

        if navTitle == "Marathon Ready" {

          workout = MarathonReady().workoutArray
        }

        if navTitle == "HIIT @ Home" {

          workout = HIITAtHome().workoutArray
        }

        if navTitle == "Get Strong" {

          workout = GetStrong().workoutArray
        }

        if navTitle == "Body Weight Blast" {

          workout = BodyWeightBlast().workoutArray
        }

        if navTitle == "Bands Pump" {

          workout = BandsPump().workoutArray
        }

        if navTitle == "Quickie Warm up" {

          workout = QuickieWarmUp().workoutArray
        }

        if navTitle == "The Best Circuit Workout" {

          workout = TheBestCircuit().workoutArray
        }

        if navTitle == "The Gym HIIT Workout" {

          workout = GymHIIT().workoutArray
        }

        if navTitle == "The Ultimate Workout" {

          workout = UltimateWorkout().workoutArray

        }


        if navTitle == "Warm up For Weights" {

            workout = WarmUpForWeights().workoutArray
        }

        if navTitle == "6 Day Bro Split" {

          workout = SixDayBroSplit().workoutArray
        }

        if navTitle == "Explosive Workout" {

         workout = ExplosiveWorkout().workoutArray
        }

        if navTitle == "Strength Circuit" {

          workout = StrengthCircuit().workoutArray
        }

        if navTitle == "Killer Circuit" {

          workout = KillerCircuit().workoutArray
        }

        if navTitle == "Fitness Test" {

          workout = FitnessTest().workoutArray
        }

        return workout.count

    }



    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        if tableView.cellForRow(at: indexPath)?.accessoryType == .checkmark {
            tableView.cellForRow(at: indexPath)?.accessoryType = .none
        } else {
            tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
        }

        tableView.deselectRow(at: indexPath, animated: false)
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


       let cell = tableView.dequeueReusableCell(withIdentifier: "prototypeCell", for: indexPath)

        if navTitle == "The 600 Workout" {

            workout = The600Workout().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "5 Days for Muscle" {

            workout = FiveDaysForMuscle().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "Marathon Ready" {

            workout = MarathonReady().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "HIIT @ Home" {

            workout = HIITAtHome().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "Get Strong" {

            workout = GetStrong().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "Body Weight Blast" {

            workout = BodyWeightBlast().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "Bands Pump" {

            workout = BandsPump().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "Quickie Warm up" {

            workout = QuickieWarmUp().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "The Best Circuit Workout" {

            workout = TheBestCircuit().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "The Gym HIIT Workout" {

            workout = GymHIIT().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "The Ultimate Workout" {

            workout = UltimateWorkout().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "Warm up For Weights" {

            workout = WarmUpForWeights().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "6 Day Bro Split" {

            workout = SixDayBroSplit().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "Explosive Workout" {

            workout = ExplosiveWorkout().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "Strength Circuit" {

            workout = StrengthCircuit().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "Killer Circuit"  {

            workout = KillerCircuit().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        if navTitle == "Fitness Test" {

            workout = FitnessTest().workoutArray

            cell.textLabel?.text = workout[indexPath.row]
        }

        cell.accessoryType = .none

        cell.layer.borderWidth = 5
        cell.layer.cornerRadius = 20
        cell.layer.borderColor = #colorLiteral(red: 0, green: 0.3285208941, blue: 0.5748849511, alpha: 1)
        cell.textLabel?.textColor = UIColor.black
        cell.textLabel?.adjustsFontSizeToFitWidth = true
        cell.textLabel?.font = .boldSystemFont(ofSize: 15)

        return cell

    }

}

Ответы [ 2 ]

4 голосов
/ 06 января 2020

Сначала создайте класс / структуру Workout с флагом

struct Workout {
    let name: String
    let isComplete: Bool
}

Создайте образец модели данных

var workouts = [
        Workout(name: "Squats", isComplete: false),
        Workout(name: "Burpees", isComplete: false),
        Workout(name: "Crunches", isComplete: true),
        Workout(name: "Push Ups", isComplete: false),
        Workout(name: "Jumping Jacks", isComplete: true),
        Workout(name: "High Knees", isComplete: false),
        Workout(name: "Lunges", isComplete: false),
        Workout(name: "Plank", isComplete: false),
        Workout(name: "Sechigh Knees", isComplete: false),
        Workout(name: "Tricep Dips", isComplete: false),
        Workout(name: "Mountain Climbers", isComplete: true),
        Workout(name: "Wall Sit", isComplete: true),
        Workout(name: "Squats 2", isComplete: false),
        Workout(name: "Burpees 2", isComplete: false),
        Workout(name: "Crunches 2", isComplete: true),
        Workout(name: "Push Ups 2", isComplete: false),
        Workout(name: "Jumping Jacks 2", isComplete: false),
        Workout(name: "High Knees 2", isComplete: false),
        Workout(name: "Lunges 2", isComplete: false),
        Workout(name: "Plank 2", isComplete: false),
        Workout(name: "Sechigh Knees 2", isComplete: true),
        Workout(name: "Tricep Dips 2", isComplete: false),
        Workout(name: "Mountain Climbers 2", isComplete: false),
        Workout(name: "Wall Sit 2", isComplete: false),
    ]

Создайте пользовательский UITableViewCell с помощью Тренировка переменная типа

class CustomCell: UITableViewCell {

    var workout: Workout? {
        didSet {
            guard let workout = workout else { return }

            self.textLabel?.text = workout.name

            if workout.isComplete {
                self.accessoryType = .checkmark
            }
            else {
                self.accessoryType = .none
            }
        }
    }
}

Затем в методе tableView:cellForRowAtIndexPath: передается переменная

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
        cell.workout = workouts[indexPath.row]

        return cell
    }
0 голосов
/ 06 января 2020

Вам нужно будет создать массив логических значений размера, равного длине числа ячеек в табличном представлении. Затем, когда состояние меняется, вам придется его обновлять.

Например: если в вашем табличном представлении есть 5 упражнений, то изначально все 5 будут ложными, поскольку ни одно из них не было выполнено.

var completed = [Bool](repeating: false, count: 5)

Затем, когда пользователь нажимает на ячейку, вам нужно обновить это значение следующим образом:

completed[indexPath.row] = !completed[indexPath.row] 

Таким образом, когда вы рендерите ячейку, вы можете проверить, если Тренировка была завершена или нет.

let cell = tableView.dequeueReusableCell(withIdentifier: "prototypeCell", for: indexPath)
cell.accessoryType = completed[indePath.row] ?  .checkmark : .none


Я обновлю ваш код, чтобы включить его, и он должен работать для вашего текущего контроллера представления. Я переместил код, где вы устанавливаете массив тренировки в отдельный код, чтобы вам больше не приходилось делать ту же работу снова. Это должно сделать ваш cellForRow намного чище.
import UIKit

class workoutTableView: UIViewController, UITableViewDataSource, UITableViewDelegate {


    var navTitle: String = ""
    var workout = [String]()
    let tlabel = UILabel()

     //Keep track of completed state
     var completed: [Bool] = []

    @IBOutlet weak var workoutTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        //Setting the workout array in a separate function so don't have to do the check in number of rows
        setWorkout()
        //Initializing the completed array
        completed = [Bool](repeating: false, count: workout.count)

        workoutTableView.delegate = self
        workoutTableView.dataSource = self
        tlabel.text = navTitle
        tlabel.textAlignment = .center
        tlabel.font = UIFont(name: "Arial Rounded MT Bold", size: 30)
        tlabel.adjustsFontSizeToFitWidth = true
        navigationItem.titleView = tlabel

    }

    func setWorkout() {

        if navTitle == "The 600 Workout" {

            workout = The600Workout().workoutArray
        }

        if navTitle == "5 Days for Muscle" {

            workout = FiveDaysForMuscle().workoutArray

        }

        if navTitle == "Marathon Ready" {

          workout = MarathonReady().workoutArray
        }

        if navTitle == "HIIT @ Home" {

          workout = HIITAtHome().workoutArray
        }

        if navTitle == "Get Strong" {

          workout = GetStrong().workoutArray
        }

        if navTitle == "Body Weight Blast" {

          workout = BodyWeightBlast().workoutArray
        }

        if navTitle == "Bands Pump" {

          workout = BandsPump().workoutArray
        }

        if navTitle == "Quickie Warm up" {

          workout = QuickieWarmUp().workoutArray
        }

        if navTitle == "The Best Circuit Workout" {

          workout = TheBestCircuit().workoutArray
        }

        if navTitle == "The Gym HIIT Workout" {

          workout = GymHIIT().workoutArray
        }

        if navTitle == "The Ultimate Workout" {

          workout = UltimateWorkout().workoutArray

        }


        if navTitle == "Warm up For Weights" {

            workout = WarmUpForWeights().workoutArray
        }

        if navTitle == "6 Day Bro Split" {

          workout = SixDayBroSplit().workoutArray
        }

        if navTitle == "Explosive Workout" {

         workout = ExplosiveWorkout().workoutArray
        }

        if navTitle == "Strength Circuit" {

          workout = StrengthCircuit().workoutArray
        }

        if navTitle == "Killer Circuit" {

          workout = KillerCircuit().workoutArray
        }

        if navTitle == "Fitness Test" {

          workout = FitnessTest().workoutArray
        }


    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return workout.count
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //Updating the status of workout for current row in saved list
        completed[indexPath.row] = !completed[indexPath.row]
        tableView.cellForRow(at: indexPath)?.accessoryType = completed[indexPath.row] ?  .checkmark : .none
        tableView.deselectRow(at: indexPath, animated: false)
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "prototypeCell", for: indexPath)
        cell.textLabel?.text = workout[indexPath.row]
        cell.accessoryType = completed[indexPath.row] ?  .checkmark : .none

        cell.layer.borderWidth = 5
        cell.layer.cornerRadius = 20
        cell.layer.borderColor = #colorLiteral(red: 0, green: 0.3285208941, blue: 0.5748849511, alpha: 1)
        cell.textLabel?.textColor = UIColor.black
        cell.textLabel?.adjustsFontSizeToFitWidth = true
        cell.textLabel?.font = .boldSystemFont(ofSize: 15)

        return cell
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...