如何将数据传递给AddController到UITableViewController

时间:2015-06-17 15:38:03

标签: swift

我的swift代码有问题。我有一个带有原型单元的UITableViewCotroller,在这个单元格中有三个标签。我使用@IBOutlet为标签创建了文件 TimerCell.swift

import UIKit

class TimerCell: UITableViewCell {

@IBOutlet var circostanza: UILabel!
@IBOutlet var luogo: UILabel!
@IBOutlet var tempo: UILabel!


override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

和文件 TimerModel.swift ,代码如下:

import UIKit

 class TimerModel: NSObject, NSCoding {


var circostanza :String!
var luogo : String!
var tempo : String!


init(circostanzaIn:String, luogoIn:String, tempoIn:String) {
    circostanza = circostanzaIn
    luogo = luogoIn
    tempo = tempoIn
}

internal required init(coder aDecoder: NSCoder) {
    self.circostanza = aDecoder.decodeObjectForKey("circostanza") as! String
    self.luogo = aDecoder.decodeObjectForKey("luogo") as! String
    self.tempo = aDecoder.decodeObjectForKey("tempo") as! String
    }

func encodeWithCoder(encoder: NSCoder) {
    encoder.encodeObject(self.circostanza, forKey: "circostanza")
    encoder.encodeObject(self.luogo, forKey: "luogo")
    encoder.encodeObject(self.tempo, forKey: "tempo")
}


}

然后我在UITableViewCotroller中有一个按钮+打开一个带有三个文本字段的AddController来添加一些数据。我想将这些数据保存在单元格的标签中。 AddController 中的代码是:

import UIKit

class AddTimerController: UIViewController, UITextFieldDelegate {

@IBOutlet var fieldCircostanza: UITextField!
@IBOutlet var fieldLuogo: UITextField!
@IBOutlet var fieldTempo: UITextField!


override func viewDidLoad() {
    super.viewDidLoad()


    fieldCircostanza.delegate = self
    fieldLuogo.delegate = self


    // 
    var keyboardToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 44))
    keyboardToolbar.barStyle = UIBarStyle.BlackTranslucent
    keyboardToolbar.backgroundColor = UIColor.redColor()
    keyboardToolbar.tintColor = UIColor.whiteColor()
    var flex = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
    var save = UIBarButtonItem(title: "Fatto", style: UIBarButtonItemStyle.Done, target: fieldTempo, action: "resignFirstResponder")
    keyboardToolbar.setItems([flex, save], animated: false)
    fieldTempo.inputAccessoryView = keyboardToolbar
}


func textFieldShouldReturn(textField: UITextField) -> Bool {
    textField.resignFirstResponder() // chiudere la tastiera nei campi di testo
    return true
}


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

@IBAction func annulla(sender: UIButton) {
    dismissViewControllerAnimated(true, completion: nil) // chiude una modal
}

@IBAction func salva(sender: UIButton) {
    if fieldCircostanza.text.isEmpty &&
        fieldLuogo.text.isEmpty &&
        fieldTempo.text.isEmpty{
            //alertView 
            return
    }

    var timer = TimerModel(circostanzaIn: fieldCircostanza.text,
        luogoIn: fieldLuogo.text,
        tempoIn: fieldTempo.text)


    DataManager.sharedInstance.salvaArray()
    DataManager.sharedInstance.detail.myCollection.reloadData()

    dismissViewControllerAnimated(true, completion: nil)
}

}

最后是 UITableViewCotroller 文件:

import UIKit

class TimerViewController: UITableViewController {

override func viewDidLoad() {
    super.viewDidLoad()


}

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

// MARK: - Table view data source

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

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return DataManager.sharedInstance.storage.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TimerCell

    //cell.circostanza.text = timer.circostanza
    //cell.luogo.text = timer.luogo
    //cell.tempo.text = timer.tempo


    return cell
}

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    // Return false if you do not want the specified item to be editable.
    return true
}

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {

        DataManager.sharedInstance.storage.removeAtIndex(indexPath.row)
        DataManager.sharedInstance.salvaArray()

        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    } 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.
    }
}

// MARK: - Navigazione

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "modifica" {
        //let controller = (segue.destinationViewController as UINavigationController).topViewController as AddController

    }
}


}

您能帮我解决保存数据的问题吗?

2 个答案:

答案 0 :(得分:0)

要访问tableViewController中的计时器,请执行以下操作:

import UIKit

class AddTimerController: UIViewController, UITextFieldDelegate {

@IBOutlet var fieldCircostanza: UITextField!
@IBOutlet var fieldLuogo: UITextField!
@IBOutlet var fieldTempo: UITextField!

var timer: TimerModel! // Made timer a class member

override func viewDidLoad() {
    ......
}

// your code ....

@IBAction func salva(sender: UIButton) {
    if fieldCircostanza.text.isEmpty &&
        fieldLuogo.text.isEmpty &&
        fieldTempo.text.isEmpty{
            //alertView 
            return
    }

    timer = TimerModel(circostanzaIn: fieldCircostanza.text, // intialize timer
        luogoIn: fieldLuogo.text,
        tempoIn: fieldTempo.text)


    DataManager.sharedInstance.salvaArray()
    DataManager.sharedInstance.detail.myCollection.reloadData()

    dismissViewControllerAnimated(true, completion: nil)
}

}

然后在tableViewController中,像这样访问它:

 class TimerViewController: UITableViewController {

    var timer: TimerModel! // Change to this

    override func viewDidLoad() {
        super.viewDidLoad()

       var controller : AddTimerController = AddTimerController()
       timer = controller.timer
    }

  // your code .......

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TimerCell

        cell.circostanza.text = timer.circostanza
        cell.luogo.text = timer.luogo
        cell.tempo.text = timer.tempo

        return cell
    }
    }

答案 1 :(得分:0)

对于您在评论中的查询,这将更正:

在你的TimerModel中:

  import UIKit

    class TimerModel: NSObject, NSCoding {


    var circostanza :String!
    var luogo : String!
    var tempo : String!


    override init() { // add this method
        super.init()
    }

    init(circostanzaIn:String, luogoIn:String, tempoIn:String) {
        circostanza = circostanzaIn
        luogo = luogoIn
        tempo = tempoIn
    }

    internal required init(coder aDecoder: NSCoder) {
        self.circostanza = aDecoder.decodeObjectForKey("circostanza") as! String
        self.luogo = aDecoder.decodeObjectForKey("luogo") as! String
        self.tempo = aDecoder.decodeObjectForKey("tempo") as! String
        }

    func encodeWithCoder(encoder: NSCoder) {
        encoder.encodeObject(self.circostanza, forKey: "circostanza")
        encoder.encodeObject(self.luogo, forKey: "luogo")
        encoder.encodeObject(self.tempo, forKey: "tempo")
    }


    }