【发布时间】:2016-02-02 13:54:48
【问题描述】:
我在使用 NSUserDefaults 在 tableView 中创建书签列表时遇到了一些麻烦。我拥有的保存和显示部分,但它删除保存的字符串并从另一个视图控制器重新加载 tableView 是我被卡住了很长时间的地方。
基本上,我只是想将带有按钮的字符串保存到 tableView 内的另一个视图控制器。选择按钮后,将字符串保存到 tableView。取消选择按钮时,从 tableView 中删除相同的字符串。
书签视图控制器
import UIKit
class BookmarkController: UIViewController {
var bookmark: String = "Hello World"
@IBOutlet var myButton: UIButton!
@IBAction func buttonAction(sender: UIButton!) {
if myButton.backgroundColor == UIColor.grayColor() {
myButton.backgroundColor = UIColor.blueColor()
favoritesList.append(bookmark)
NSUserDefaults.standardUserDefaults().setObject(favoritesList, forKey:"favoritesList")
NSUserDefaults.standardUserDefaults().synchronize()
}
else if myButton.backgroundColor == UIColor.blueColor() {
myButton.backgroundColor = UIColor.grayColor()
NSUserDefaults.standardUserDefaults().removeObjectForKey("favoritesList")
NSUserDefaults.standardUserDefaults().synchronize()
}
}
override func viewDidLoad() {
super.viewDidLoad()
if (NSUserDefaults.standardUserDefaults().objectForKey("favoritesList") != nil) {
myButton.backgroundColor = UIColor.blueColor()
}else{
myButton.backgroundColor = UIColor.grayColor()
}
}
}
带有 tableView 的视图控制器(保留数据)
import UIKit
var favoritesList = [String]()
class SecondViewController: UIViewController, UITableViewDelegate {
@IBOutlet var toDoListTable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
if NSUserDefaults.standardUserDefaults().objectForKey("favoritesList") != nil {
favoritesList = NSUserDefaults.standardUserDefaults().objectForKey("favoritesList") as! [String]
}
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return favoritesList.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
cell.textLabel!.font = UIFont.systemFontOfSize(14.0)
cell.textLabel!.numberOfLines = 0
cell.textLabel!.text = favoritesList[indexPath.row]
return cell
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath){
if editingStyle == UITableViewCellEditingStyle.Delete{
favoritesList.removeAtIndex(indexPath.row)
NSUserDefaults.standardUserDefaults().setObject(favoritesList, forKey: "favoritesList")
toDoListTable.reloadData()
}
override func viewDidAppear(animated: Bool) {
toDoListTable.reloadData()
}
}
【问题讨论】:
-
一个建议,如果你有
if (true) { set -> sync () } else { set -> sync () },你应该把它改成if (true) { set } else { set } sync ()- 更简洁的代码 -
不知道这是否真的是您的问题,但我注意到的一件事是您正在删除孔列表?
NSUserDefaults.standardUserDefaults().removeObjectForKey("favoritesList")而不仅仅是按钮值? -
无需强制同步
-
@LeoDabus 每次按下按钮时我都会设置
NSUserDefaults.standardUserDefaults().synchronize()。我觉得 tableView 在那之后由于某种原因没有重新加载。 -
可以全部删除。问题是别的
标签: ios swift uitableview swift2 nsuserdefaults