2016-12-01 1 views
0

빠른 코딩 문제가 있습니다. 먼저, Xcode 8과 스위프트 2를 사용하고 있습니다. 여기에 내 viewcontroller의 빠른 이미지가 있으므로 더 나은 아이디어를 얻을 수 있습니다. Image of my viewcontrollerNSUserDefaults 및 UITableView의 지속성

위 이미지에서 목표 (텍스트 필드에 텍스트)를 삽입하고 제출을 누릅니다. 제출 버튼 ("Submit Goal")은 텍스트 필드의 텍스트를 배열에 삽입합니다. 그런 다음이 배열은 tableview에 표시됩니다.

내 질문은 배열을 저장하려면이 viewcontroller NSUserDefualts 어떻게 구현합니까? 또한 사용자가 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

나는 당신의 질문에 일하고 있었다, 이것은 내 솔루션 내가 목표에 대한 모델을 만드는 모든

먼저입니다입니다 : 여기

는 순간의 ViewController에 대한 내 코드입니다 간단한 일이 단지 목표의 텍스트를 가지고 있고, 또한 두 개의 정적 방법, 저장 용 및 부하에 대한 다른

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); 
} 

} 

여기 내 구현은 내에는, 그리고 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 
    } 
} 


} 

나는 이것이 당신이