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
관련 자료
- 제거 버튼을 클릭했을 때 삭제되지 않는 Reactjs 테이블 행 사용
- inno setup - 공유 파일이 설치 디렉토리에서 삭제되지 않습니다
- node.js - mongodb 데이터베이스에서 문서가 삭제되지 않는 이유는 무엇입니까?
- java - 결합 테이블 레코드가 삭제 및 작성 중 (ORM)
- Azure 서비스 버스 주제/구독이 삭제됨
- sql server - 스토어드 프로 시저를 사용하여 TSQL에서 삭제중인 데이터에 따라 메시지 리턴
- git status가 다른 작업 트리로 추가 된 후 파일이 삭제되었다고 왜보고합니까?
- cygwin - 자식은 복원 된 삭제 된 파일을 무시합니다
- android - 앱을 닫고 하단 네비게이터 조각에서 다시 열면 데이터가 복원되지 않습니다
- java - JAVA_HOME은 설정했지만 계속 삭제됩니다
- 레코드가 삭제되지 않도록하는 방법 Rails 6
- c++ - shared_ptrs가 두 번 삭제됨
내가 보는 문제는 에updateTasks함수를 사용하면 task_1, task_2 등의 키로 UserDefaults에서 작업을 가져옵니다. 그러나 특정 작업을 삭제할 때 task_2라고하면 UserDefaults에서 삭제하는 것이 아니라 작업 배열에서 제거하는 것입니다. 그래서 전화 할 때마다updateTasks기능을 사용하면 삭제 된 작업이 다시 나타납니다.
EntryViewController에서 다음과 같이 saveTask 함수를 변경하십시오.
ViewController에서 다음 기능을 변경하십시오.