2016-12-01 36 views
0

我有一個快速編碼問題。首先,我使用XCode 8和Swift 2.這是我的視圖控制器的快速圖像,因此您可以獲得更好的主意。 Image of my viewcontrollerUITableView中的NSUserDefaults和持久性

在上圖中,您將一個目標(文本插入文本字段)並按提交。提交按鈕(「提交目標」)將文本字段中的文本插入到數組中。這個數組然後顯示在tableview中。

我的問題是,我如何實現NSUserDefualts到這個viewcontroller來保存數組?如果用戶從tableview中刪除一個目標,這也需要能夠更新數組。

這裏是我此刻的視圖 - 控制代碼:

// 
// VCWeeklyGoals.swift 
// FitNote 
// 
// Created by ---- on 9/21/16. 
// Copyright © 2016 Haiden Stiles. All rights reserved. 
// 

import UIKit 

class VCWeeklyGoals: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate { 

    //MARK: Properties 








//DATE AND TIME 
@IBOutlet weak var labelDate: UILabel! 
var timer = NSTimer() 

@objc func tick() { 
    labelDate.text = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .MediumStyle, timeStyle: .MediumStyle) 
} 
//END DATE AND TIME 

//BEGINNING ROUNDED BUTTONS FOR MONDAY THROUGH FRIDAY 
//@IBOutlet weak var roundedButtonMonday: UIButton! 


    //ROUNDED BUTTON FOR SUBMIT GOAL 
@IBOutlet weak var roundedButtonSubmitGoal: UIButton! 
    //END ROUNDED BUTTON FOR SUBMIT GOAL 

//END ROUNDED BUTTONS FOR MONDAY THROUGH FRIDAY 







//BEGINNING OF TABLE FUNCTIONS AND PROPERTIES 

@IBOutlet var tableView: UITableView! 
@IBOutlet var insertedGoal: UITextField! 

//var tableTitles = NSUserDefaults.standardUserDefaults().arrayForKey("tableTitles") as! [String] 
var tableTitles = [String]() 




@IBAction func buttonSubmitGoal(sender: UIButton) { 

    self.view.endEditing(true) 

    var error = "" 

    if insertedGoal.text == "" { 

     error = "Please enter a goal!" 
    } else { 

     tableTitles.append(insertedGoal.text!) 
     self.tableView.reloadData() 
    } 

    if error != "" { 

     let alert = UIAlertController(title:"Error In Form", message: error, preferredStyle: UIAlertControllerStyle.Alert) 
     alert.addAction(UIAlertAction(title:"OK", style: .Default, handler: { action in 

      //self.dismissViewControllerAnimated(true, completion:nil) 

     })) 

     self.presentViewController(alert, animated:true, completion:nil) 

    } 

    insertedGoal.text = "" 

} 



//func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
// return 1 
//} 


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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ 

    let cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell 

    let object = tableTitles[indexPath.row] 
    cell.textLabel!.text = object 

    return cell 
} 

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
    if editingStyle == UITableViewCellEditingStyle.Delete { 
     tableTitles.removeAtIndex(indexPath.row) 
     tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 
    } 
} 

//END OF TABLE FUNCTIONS AND PROPERTIES 



//OVERRIDE FUNCTIONS 

override func viewDidLoad() { 
    super.viewDidLoad() 



    if let temp = NSUserDefaults.standardUserDefaults().objectForKey("tableTitles") as? [String] { 
     tableTitles = temp 
    } 


    // Do any additional setup after loading the view. 

    //TABLE PROPERTIES 
    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 

    self.insertedGoal.delegate = self 
    tableView.delegate = self 
    tableView.dataSource = self 
    //END TABLE PROPERTIES 

    //DATE PROPERTIES 
    timer = NSTimer.scheduledTimerWithTimeInterval(1.0, 
     target: self, 
     selector: #selector(tick), 
     userInfo: nil, 
     repeats: true) 
    //END DATE PROPERTIES 

    //ROUNDED BUTTON FOR MONDAY THROUGH FRIDAY PROPERTIES 
    //MONDAY 
    //roundedButtonMonday.backgroundColor = UIColor.whiteColor() 
    //roundedButtonMonday.layer.cornerRadius = 6 
    //roundedButtonMonday.layer.borderWidth = 0.5 
    //roundedButtonMonday.layer.borderColor = UIColor.blueColor().CGColor 


     //ROUNDED BUTTON FOR SUBMIT GOAL 
    roundedButtonSubmitGoal.backgroundColor = UIColor.clearColor() 
    roundedButtonSubmitGoal.layer.cornerRadius = 7 
    roundedButtonSubmitGoal.layer.borderWidth = 1 
    roundedButtonSubmitGoal.layer.borderColor = UIColor.blueColor().CGColor 

     //END ROUNDED BUTTON FOR SUBMIT GOAL 
    //END ROUNDED BUTTON FOR MONDAY THROUGH FRIDAY PROPERTIES 

    //DATE PICKER 

    //END DATE PICKER 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

} 
+1

不要使用'NSUserDefaults'保存數據的簡單細胞。這不是它的目的。使用'NSArray'的方法將數組寫入文件。 – rmaddy

+0

我正在看NSArray,但我覺得我沒有取得任何進展...你會介意在正確的方向指導我實施NSArray嗎? –

回答

0

我一直在研究你的問題,這是我的解決方案

首先我創建目標模型的,是一個簡單的,這只是有目標的文本,以及兩個靜態方法,一個用於保存和另一個用於負載

class Goal: NSObject { 

var text : String = "" 

init(text: String) { 
    super.init() 
    self.text = text 
} 

static func loadFromFile(fileName:String) ->[Goal]? 
{ 
    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true); 
    let docsDirectory = paths[0]; 
    let path = docsDirectory + "/" + fileName; 
    let data = NSArray(contentsOfFile: path); 

    if(data != nil) 
    { 
     var returnArray : [Goal] = [] 
     for object in data! { 
      returnArray.append(Goal(text: object as! String)) 
     } 
     return returnArray 
    } 

    return nil 
} 

static func saveToPlist(filename:String,goals:[Goal]) -> Bool { 

    let toSaveArray = NSMutableArray(); 
    for goal in goals { 
     toSaveArray.add(goal.text) 
    } 

    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true); 
    let docsDirectory = paths[0]; 
    let path = docsDirectory + "/" + filename; 
    return toSaveArray.write(toFile: path, atomically: true); 
} 

} 

這裏是我實現我的ViewController,而GoalTableViewCell是隻有一個UILabel

import UIKit 

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 

@IBOutlet weak var tfGoalTextAdd: UITextField! 
@IBOutlet weak var btnAdd: UIButton! 
@IBOutlet weak var tableView: UITableView! 
var goals : [Goal] = [] 
override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    self.tableView.estimatedRowHeight = 40; 
    self.loadGoals() 
    self.btnAdd.addTarget(self, action: #selector(addGoalWithTextFieldText), for: .touchUpInside) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

public func loadGoals() 
{ 
    if let arrayGoals = Goal.loadFromFile(fileName: "goals") 
    { 
     self.goals = arrayGoals 
    } 
} 

public func addGoalWithTextFieldText() 
{ 
    if(self.tfGoalTextAdd.text != nil && self.tfGoalTextAdd.text != "") 
    { 
     self.addGoal(text: self.tfGoalTextAdd.text!) 
     self.tfGoalTextAdd.text = "" 
    } 
} 

public func addGoal(text: String) 
{ 
    self.goals.append(Goal(text: text)) 
    self.tableView.reloadData() 
    if(Goal.saveToPlist(filename: "goals", goals: goals)) 
    { 
     debugPrint("Successful saved") 
    } 
} 

public func removeGoal(goal:Goal) 
{ 
    goals.remove(at:goals.index(of: goal)!) 
    self.tableView.reloadData() 
    if(Goal.saveToPlist(filename: "goals", goals: goals)) 
    { 
     debugPrint("Successful saved") 
    } 
} 


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


public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier: 
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls) 
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    let cell = tableView.dequeueReusableCell(withIdentifier: "GoalCell") as! GoalTableViewCell 
    cell.setupWithGoal(goal: self.goals[indexPath.row]) 
    return cell 
} 


public func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
    return true 
} 


public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle { 
    return .delete 
} 

public func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 
     // Delete the row from the data source 

     //tableView.beginUpdates() 
     self.removeGoal(goal: self.goals[indexPath.row]) 

     //tableView.endUpdates() 

    } else if editingStyle == .insert { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
    } 
} 


} 

我希望這有助於你