【发布时间】:2016-03-10 20:22:51
【问题描述】:
我对 Swift 比较陌生,正在制作一个基本的家庭作业日记应用程序。到目前为止,我所拥有的是嵌入在导航控制器中的 UITableView,该导航控制器嵌入在标签栏控制器中。我已经成功地实现了拉动刷新,在 UIAlertView 中添加数据并在刷新后用这些数据填充表。我需要这个应用程序的持久数据,我听说 NSUserDefaults 是最好的方法,但它对我不起作用。我可以看到它正在添加到 NSUserDefaults,但在我关闭并重新打开应用程序后,它似乎没有重新出现在 UITableView 中。有什么建议?我的代码如下。另外,要将这些数据放到网上,有没有办法将 Google 表格用作我的应用的在线数据库?
import UIKit
var classesData = [String]()
var teachersData = [String]()
let defaults = NSUserDefaults.standardUserDefaults()
var tableData1 = defaults.valueForKey("classesData") as! NSArray
var tableData2 = defaults.valueForKey("teachersData") as! NSArray
class ClassesList: UIViewController, UITableViewDelegate, UITableViewDataSource, UIPopoverPresentationControllerDelegate {
lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged)
return refreshControl
}()
@IBOutlet weak var tableView: UITableView!
@IBAction func addClass(sender: AnyObject) {
var subjectTextField: UITextField?
var teacherTextField: UITextField?
let alertController = UIAlertController(title: "Add Class", message: "Please input the name of the subject and the teaceher", preferredStyle: .Alert)
let done = UIAlertAction(title: "Done", style: .Default, handler: { (action) -> Void in
classesData.append(subjectTextField!.text!)
teachersData.append(teacherTextField!.text!)
print(classesData)
print(teachersData)
})
let cancel = UIAlertAction(title: "Cancel", style: .Cancel) { (action) -> Void in
}
alertController.addAction(done)
alertController.addAction(cancel)
alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in
// Enter the textfiled customization code here.
subjectTextField = textField
subjectTextField?.placeholder = "Subject"
}
alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in
// Enter the textfiled customization code here.
teacherTextField = textField
teacherTextField?.placeholder = "Teacher"
}
presentViewController(alertController, animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "classCell")
self.tableView.addSubview(self.refreshControl)
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func handleRefresh(refreshControl: UIRefreshControl) {
defaults.setValue(classesData, forKey: "classesData")
defaults.setValue(teachersData, forKey: "teachersData")
print(tableData1)
defaults.synchronize()
self.tableView.reloadData()
refreshControl.endRefreshing()
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return classesData.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("classCell")! as UITableViewCell
cell.textLabel?.text = (tableData1[indexPath.row] as? String)! + " , " + (tableData2[indexPath.row] as? String)!
return cell
}
}
【问题讨论】:
-
您需要检查的第一件事是 NSUserDefaults 是否包含您在打开应用程序时要查找的元素!查看 viewDidLoad 中 NSUserDefaults 的内容,看看它是否包含任何内容!
-
@Gautam Jethwani NSUserDefaults 有一个名为 stringArrayForKey 的方法。你应该看看
-
如果您说
UITableView,我立即怀疑您的数据(无论表中的内容)有点复杂。阅读 Core Data 和数据库结构可能值得您花时间阅读。
标签: ios swift uitableview nsuserdefaults