>source

TodoList 앱을 만들고 있습니다. 목록에서 작업을 스 와이프하여 삭제 한 다음 새 작업을 추가하면 삭제 된 작업이 복원됩니다. 스토리 보드와 UIKit을 사용하세요. 삭제 된 상태로 유지하고 싶은데 어떻게해야하나요? ..

맥 10.15.7 xcode 12.1

import UIKit
class ViewController: UIViewController {
    
    @IBOutlet var tableView: UITableView!
    var tasks = [String]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "リスト"
        
        tableView.delegate = self
        tableView.dataSource = self
        
        if !UserDefaults().bool(forKey: "setup") {
            UserDefaults().set(true, forKey: "setup")
            UserDefaults().set(0, forKey: "count")
        }
        updateTasks()
    }
    
    func updateTasks() {
        
        tasks.removeAll()
        
        guard let count = UserDefaults().value(forKey: "count") as? Int else {
            return
        }
        
        for x in 0..<count {
            if let task = UserDefaults().value(forKey: "task_\(x+1)") as? String {
                tasks.append(task)
            }
        }
        tableView.reloadData()
    }
    
    @IBAction func didTapAdd() {
        
        let vc = storyboard?.instantiateViewController(identifier: "entry") as! EntryViewController
        vc.title = "リストに追加"
        vc.update = {
            //非同期処理 更新を優先
            DispatchQueue.main.async {
                self.updateTasks()
            }
        }
        navigationController?.pushViewController(vc, animated: true)
    }
}
extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        
        let vc = storyboard?.instantiateViewController(identifier: "task") as! TaskViewController
        vc.title = "リストに追加"
        vc.task = tasks[indexPath.row]
        navigationController?.pushViewController(vc, animated: true)
    }
}
extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tasks.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = tasks[indexPath.row]
        return cell
    }
    
    //タスクを削除
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        let index = indexPath.row
        tasks.remove(at: index)
        let userDefaults = UserDefaults.standard
        userDefaults.set(tasks, forKey: "tasks")
        userDefaults.removeObject(forKey: "tasks")
        tableView.reloadData()
    }
}

remove (at :)가 다른가요?

import UIKit
class EntryViewController: UIViewController, UITextFieldDelegate {
    
    @IBOutlet var field: UITextField!
    var update: (() -> Void)?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        field.delegate = self
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "保存", style: .done, target: self, action: #selector(saveTask))
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        saveTask()
        return true
    }
    
    @objc func saveTask() {
        guard let text = field.text, !text.isEmpty else {
            return
        }
        guard let count = UserDefaults().value(forKey: "count") as? Int else {
            return
        }
        let newCount = count + 1
        UserDefaults().set(newCount, forKey: "count")
        UserDefaults().set(text, forKey: "task_\(newCount)")
        update?()
        navigationController?.popViewController(animated: true)
    }
}

UserDefaults를 저장하는 방법?


  • 답변 # 1

    내가 보는 문제는 에updateTasks함수를 사용하면 task_1, task_2 등의 키로 UserDefaults에서 작업을 가져옵니다. 그러나 특정 작업을 삭제할 때 task_2라고하면 UserDefaults에서 삭제하는 것이 아니라 작업 배열에서 제거하는 것입니다. 그래서 전화 할 때마다updateTasks기능을 사용하면 삭제 된 작업이 다시 나타납니다.

    EntryViewController에서 다음과 같이 saveTask 함수를 변경하십시오.

    @objc func saveTask() {
        guard let text = field.text, !text.isEmpty else {
            return
        }
        let tasks = UserDefaults.standard.array(forKey: "tasks") as? [String] ?? []
        tasks.append(text)
        UserDefaults.standard.set(tasks, forKey: "tasks")
        update?()
        navigationController?.popViewController(animated: true)
    }
    
    

    ViewController에서 다음 기능을 변경하십시오.

    func updateTasks() {
        
        tasks.removeAll()
        
        tasks = UserDefaults.standard.array(forKey: "tasks") as? [String] ?? []
        
        tableView.reloadData()
    }
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        tasks.remove(at: indexPath.row)
        let userDefaults = UserDefaults.standard
        userDefaults.set(tasks, forKey: "tasks")
        updateTasks()
    }
    
    

  • 이전 c# - PDF 문서가 서버 측 ASPNET 앱에서 인쇄되지 않음
  • 다음 flutter - 클래스의 인스턴스에서 데이터 액세스