2017-11-28 18 views
0

연락처 목록을 만들 때 UITabBarController를 사용하고 있지만 데이터를로드하기 위해 배열을 저장하려고 할 때 응용 프로그램을 다시 시작하면 데이터가없는 곳에 문제가 발생합니다. 표시됩니다. UserDefaults를 사용하여 데이터를 저장하고 앱을 다시 시작할 때 복원합니다.UserDefault에 배열을 저장하는 방법

이 코드에서 텍스트 필드의 데이터를 list라는 배열로 보냈습니다.

import UIKit 

class NewContactoViewController: UIViewController { 

@IBOutlet weak var input: UITextField! 

@IBAction func add(_ sender: Any) { 
    if (input.text != "") { 

     list.append(input.text!) 
     UserDefaults.standard.set(list, forKey: "SavedValue") 
     input.text = "" 
    } 
} 
} 

이 코드에서는 데이터를 테이블에 인쇄하고 사용자 기본값으로 저장하려고합니다.

import UIKit 

var list = [String]() 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if let x = UserDefaults.standard.object(forKey: "SavedValue") as? String { 
     return (x.count) 
    } 
    return (0) 
} 

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

    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell") 
    if let x = UserDefaults.standard.dictionary(forKey: "SavedValue") as? String { 
     cell.textLabel?.text = [x[indexPath.row]] 
    } 
    return(cell) 
} 

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == UITableViewCellEditingStyle.delete { 
     list.remove(at: indexPath.row) 
     myTableView.reloadData() 
    } 
} 

override func viewDidAppear(_ animated: Bool) { 
    myTableView.reloadData() 
} 

@IBOutlet weak var myTableView: UITableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

} 
} 
+0

NewContactoViewController에서 목록 배열을 선언하는 방법은 무엇입니까? ViewController를 어떻게 전달하는지 더 설명해주십시오. –

답변

0

당신은 문자열의 배열을 저장하지만 당신은 분명히 작동하지 않을 수 단일 문자열 (또는 사전)을 읽고있다. 문자열 배열을 읽는 전용 메서드 stringArray(forKey이 있습니다. 그렇다 결코 테이블 뷰 데이터 소스 및 위임 방법의 데이터 소스를 채우기 위해 UserDefaults에서 읽을 문제에서

에서 데이터 소스 배열 을 넣어 예를

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    if let savedArray = UserDefaults.standard.stringArray(forKey: "SavedValue") { 
     list = savedArray 
    } 
    myTableView.reloadData() 
} 

에 대한 viewDidLoad 또는 viewWillAppear에서 할 뷰 컨트롤러. 데이터 소스로서의 글로벌 변수는 매우 나쁜 프로그래밍 습관입니다. listreturn에서 numberOfRowsInSection 반환 항목 수에

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    var list = [String]() 
    ... 

cellForRow에서

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

동일에는 괄호가없는 함수가 아닙니다. list에서 항목을 가져 와서 다시 사용할 수있는 셀을 사용하고 return은 (는) 기능이 아닙니다.

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
    cell.textLabel?.text = list[indexPath.row] 
    return cell 
} 

참고 :

UserDefaults 뷰 컨트롤러 사이에서 데이터를 공유 할 수있는 잘못된 곳이라고 생각해. segues, 콜백 또는 프로토콜/위임을 사용하십시오.

+0

감사합니다. 왜 내가 배열을 탭 컨트롤러의 다른 컨트롤러에서 액세스하는 전역 변수로 선언했는지, 왜 나쁜 습관인지 알지 못했기 때문에 많은 도움이되었습니다. –