2017-12-23 2 views
2

데이터가 내 응용 프로그램 "노트"에 대한 코드가 (스위프트)데이터는 (스위프트)가있는 TableView에서

제거 제거된다.

그러나 때로는 테이블의 데이터가 삭제되기도합니다.

어떻게 해결할 수 있습니까? 다시 페이지를 스크롤하면

는, 데이터가

를 삭제됩니다 ** 내가 저장 한 데이터를로드하는 데 사용 : **

func save() { 
    UserDefaults.standard.set(myData, forKey: "notes") 
    UserDefaults.standard.synchronize() 
} 
func load(){ 
    if let loadData = UserDefaults.standard.value(forKey: "notes") as? [String] { 
     myData = loadData 
     table.reloadData() 
    } 
} 

gif

의 ViewController 1
import UIKit 

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
@IBOutlet weak var table: UITableView! 
var myData: [String] = [] 
var selectedRow: Int = -1 
var newRowText:String = "" 
var detailView: DetailViewController! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    load() 
} 
override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    if selectedRow == -1 { 
     return 
    } 
    myData[selectedRow] = newRowText 
    if newRowText == "" { 
     myData.remove(at: selectedRow) 
    } 
    table.reloadData() 
    save() 
} 
@objc func AddNewNotes(){ 
    if table.isEditing{ 
     return 
    } 
    let name:String = "" 
    myData.insert(name, at: 0) 
    let indexPath: IndexPath = IndexPath(row: 0, section: 0) 
    table.insertRows(at: [indexPath], with: .automatic) 
    table.selectRow(at: indexPath, animated: true, scrollPosition: .none) 
    self.performSegue(withIdentifier: "detail", sender: nil) 
} 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return myData.count 
} 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell")! 
    cell.textLabel?.text = myData[indexPath.row] 
    return cell 
} 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let detailView:DetailViewController = segue.destination as!DetailViewController 
    selectedRow = table.indexPathForSelectedRow!.row 
    detailView.masterView = self 
    detailView.setText(t: myData[selectedRow]) 
} 
} 
+0

뷰가 다시 표시 될 때'selectedRow'의 값은 무엇입니까 ('viewWillAppear'가 반환 될 때 호출됩니까?)? – Barns

+1

관련이 없지만 ** 결코 ** 값을 사용해서는 안됩니다. ('Key :'UserDefaults'에서 문자열 배열을 가져와야합니다.) stringArray (forKey :' – vadian

+0

동의합니다. @ vadian의 좋은 점에 동의합니다 :) –

답변

1

데이터 또한,

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    // ... 
    save() 
    myTableView.reloadData() 
    // ... 
} 

: 당신이 myData에서 테이블 뷰를 작성되는 소스 배열은, 당신이 viewWillAppear(_:) 수명주기 방법에서 테이블 뷰 (table.reloadData()를) 다시로드 전에 save() 방법 를 호출 할 필요가 보인다 (분명히) myData 데이터 소스에 저장된 원하는 데이터가 포함되어 있는지 확인하십시오.

두 번째보기 컨트롤러를 떠나기 전에 데이터를 저장하는 것이 좋습니다. 아마 viewWillDisappear(_:)을 사용하는 것이 좋습니다. 이를 적용하면 더 이상 첫 번째 뷰 컨트롤러에서 save()을 호출 할 필요가 없으므로 테이블 뷰를 다시로드하면됩니다. 첫 번째보기 컨트롤러는 저장된 데이터를 표시해야하지만 저장하지 않으므로 데이터를 추가하는 두 번째보기 컨트롤러에 있어야하므로 더 논리적입니다.

+0

그러나 무엇을 작성했는지에 대해서는 자세히 이해하지 못했습니다. 그러나 – B2Fq

+0

이해할 수없는 부분은 무엇입니까? –

+0

데이터를 이전에 저장하는 것이 좋습니다. PLS – B2Fq