Ios 保持选中标记Swift
我正在开发一个基于健身的应用程序,用户将选择他们的训练,然后进入包含所选训练的训练的表格视图。当用户点击单元格时,我希望出现一个复选标记,表示练习已经完成。我已成功完成此操作,但现在我希望保留复选标记,因此如果用户关闭应用程序,则当它重新打开并再次选择训练时,复选标记仍将显示 任何帮助都将不胜感激 下面是表格视图VC 先谢谢你Ios 保持选中标记Swift,ios,swift,Ios,Swift,我正在开发一个基于健身的应用程序,用户将选择他们的训练,然后进入包含所选训练的训练的表格视图。当用户点击单元格时,我希望出现一个复选标记,表示练习已经完成。我已成功完成此操作,但现在我希望保留复选标记,因此如果用户关闭应用程序,则当它重新打开并再次选择训练时,复选标记仍将显示 任何帮助都将不胜感激 下面是表格视图VC 先谢谢你 import UIKit class workoutTableView: UIViewController, UITableViewDataSource, UITabl
import UIKit
class workoutTableView: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var workoutTableView: UITableView!
var navTitle: String = ""
var workout = [String]()
let tlabel = UILabel()
var completed: [Bool] = []
var saveString = String()
var saveBool = Bool()
override func viewDidLoad() {
super.viewDidLoad()
setWorkout()
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) {
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
}
}
我要做的是创建一个包含某种值的训练列表(稍后可能是Indexath的索引)。然后在用户默认值 中存储NSARPLATE或NSCORGONE,我会考虑添加一个结构来更好地组织你的锻炼。我没有为您测试或完全重写代码,但希望这对您有所帮助:
import Foundation
class workoutTableView: UIViewController, UITableViewDataSource, UITableViewDelegate {
struct Workout {
let id: Int
let name: String
let workouts: [String]
}
let defaults = UserDefaults.standard
var workouts: [Workout] = []
var completed: [Int] = []
let workoutsKey = "CompletedWorkoutIds"
override func viewDidLoad() {
super.viewDidLoad()
self.completed = defaults.object(forKey: workoutsKey) as? [Int] ?? [Int]()
}
...
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let workout = self.workouts[indexPath.row]
if let index = completed.index(of: workout.id) {
self.completed.remove(at: index)
} else {
self.completed.append(workout.id)
}
defaults.set(self.completed, forKey: workoutsKey)
// Update checkmark
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let workout = self.workouts[indexPath.row]
if completed.contains(workout.id) {
// Show checkmark
}
}
}
请忽略save字符串和save bool,它们是我失败尝试的一部分:(实际上,您必须为每种类型分别保存所选训练的数组。这与将所选行保存在一个数组中的方式不符。我建议将整个训练数据保存在一个数据库中,如核心数据。并且再次保存一组连续的
if
表达式(没有else
)效率极低。请注意,即使navTitle
是的“600训练”
谢谢,我修改了if/else if语句。关于持久性,当你说将它们保存到数据库中时,你是指整个模型还是仅指类型?再次感谢,我指的是整个模型