swift - 通过prepareforsegue在2个视图控制器之间添加值

时间:2015-02-17 08:36:34

标签: xcode swift segue viewcontroller

我有2个ViewControllers:ViewController1,ViewController2。 ViewController1中的“添加”按钮将调出ViewController2。然后,用户将输入值到ViewController2中,然后由prepareforsegue将其传递回ViewController1。然后将这些值附加到viewcontroller1中的类型数组的属性中。

这是重复的,用户继续按下添加按钮从ViewController1调出ViewController2,然后通过prepareforsegue添加新值以附加到ViewController1中数组类型的属性。

但是,从ViewController2追加第一组值后,情况并非如此。第二组值将覆盖第一组值。

示例

第一次通过后 - > force = [1],刚度[1]

第二次通过后 - > force = [2],刚度[2]

我会想要这个 - > force = [1,2],刚度[1,2]

我想继续添加,直到 - > force = [1,2,3,4,5],刚度[1,2,3,4,5]

ViewController1

class ViewController1: UITableViewController, UITableViewDataSource {
    var force = [Float]()
    var stiffness = [Float] ()
@IBAction func Add(sender: AnyObject) { }

}

ViewController2

class ViewController2: UIViewController {
        var forceVar : Float = 0.0
        var stiffVar : Float = 0.0

@IBAction func submit(sender: AnyObject) {
        self.performSegueWithIdentifier("springSubmit", sender: sender)
        }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if(segue.identifier == "springSubmit") {
            var svcSubmitVariables = segue.destinationViewController as ViewController1

            svcSubmitVariables.force.append(forceVar)
            svcSubmitVariables.stiffness.append(stiffVar)   
        }

2 个答案:

答案 0 :(得分:1)

performSegueWithIdentifier方法将始终初始化新的视图控制器,因此在您的示例视图控制器中,显示ViewController2与提交数据后初始化的对象不同,并且这个新初始化的对象将只具有初始化值。要实现您正在寻找的内容,您需要在ViewController1上声明一个函数,该函数将数据附加到数组,将该函数传递给ViewController2并在submit方法上调用它,以便您的视图控制器看起来像这样:

<强> ViewController1

class ViewController1: UITableViewController, UITableViewDataSource {

    var force = [Float]()
    var stiffness = [Float] ()

    override func viewWillAppear(animated: Bool) {

     //check if values are updated
     println(force)
     println(stiffness)
    }

    @IBAction func Add(sender: AnyObject) { 
        self.performSegueWithIdentifier("viewController2", sender: sender)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if(segue.identifier == "viewController2") {

            var addVariables = segue.destinationViewController as ViewController2
            addVariables.submitFunc = appendData
        }          
    }

    func appendData(newForce:Float,newStiffness:Force){
        force.append(newForce)
        stiffness.append(newStiffness)
    }       
}

<强> ViewController2

class ViewController2: UIViewController {
    var forceVar : Float = 0.0
    var stiffVar : Float = 0.0
    var submitFunc:((newForce:Float,newStiff:Float)->())!

    @IBAction func submit(sender: AnyObject) {

        submitFunc(forceVar,stiffVar)
        self.dismissViewControllerAnimated(false, completion: nil)

    }
}

答案 1 :(得分:0)

<强>的ViewController

    import UIKit

class ViewController: UITableViewController, UITableViewDataSource {

    var springNumber:NSInteger = 0
    var force = [Float]()
    var stiffness = [Float] ()

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

    override func tableView(tableView: UITableView,
        numberOfRowsInSection section: Int) -> Int {
            return springNumber
    }

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

            let cell = tableView.dequeueReusableCellWithIdentifier("Cell")
                as UITableViewCell

            cell.textLabel!.text = "Spring \(indexPath.row)"

            return cell
    }

    func fwall() -> Float {
        for rows in 0..<(springNumber+1)  {
            force[0] = force[0] + force[rows]
        }
        force[0] = -(force[0])
        return force[0]
    }

    override func viewWillAppear(animated: Bool) {

        super.viewWillAppear(animated)

        title = "Springs' Variables"
            tableView.registerClass(UITableViewCell.self,
                forCellReuseIdentifier: "Cell")

        if(springNumber==0) {
            force.append(0.0) }

        println(force)
        println(stiffness)
    }

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

    //Adding Values
    @IBAction func Add(sender: AnyObject) {
        self.performSegueWithIdentifier("addSpring", sender: sender)
    }

    @IBAction func solve_Pressed(sender: AnyObject) {
        self.fwall()
        self.performSegueWithIdentifier("Solve", sender: sender)
    }

    func appendData (newForce: Float, newStiffness:Float, newSpring: NSInteger) {
        force.append(newForce)
        stiffness.append(newStiffness)
        springNumber = newSpring
        println(springNumber)
        println(force)
        println(stiffness)
    }

    override func prepareForSegue ( segue: UIStoryboardSegue, sender: AnyObject!) {

        if (segue.identifier == "addSpring") {
            var addVariables = segue.destinationViewController as SpringTableViewControllerInsertVariables
                addVariables.submitFunc = appendData
        }

        if (segue.identifier == "Solve") {
            var svcViewController2 = segue.destinationViewController as ViewController2
            svcViewController2.forceView2 = self.force
            svcViewController2.stiffView2 = self.stiffness
            svcViewController2.springNumView2 = self.springNumber
        }

        if (segue.identifier == "showDetail") {

        }
    }
}

springTableViewControllerInsertVariables的代码

import UIKit

class SpringTableViewControllerInsertVariables:UIViewController {

var forceVar : Float = 0.0
var stiffVar : Float = 0.0
var springNum : NSInteger = 0

var submitFunc: ((newForce:Float,newStiff:Float,newSpring:NSInteger)->())!

@IBOutlet weak var image: UIImageView!

var imageArray :[UIImage] = [UIImage(named: "springAtWall.jpg")!, UIImage(named:"spring.jpg")!]

override func viewDidLoad() {
    if(springNum == 0) {image.image = imageArray[0] }
    else {image.image = imageArray[1] }
}

@IBOutlet weak var force: UILabel!
@IBOutlet weak var forceEntered: UITextField!

@IBOutlet weak var stiffness: UILabel!
@IBOutlet weak var stiffnessEntered: UITextField!

@IBAction func checkboxed(sender: AnyObject) {
    //when checkedboxed is checked here. 
    //1)UIImage is changed
    //2)calculate2 function is used for calculate1
}

@IBAction func submit(sender: AnyObject) {
    //might not work because springNum will be initialise to zero when this viewcontroller starts...

    forceVar = (forceEntered.text as NSString).floatValue
    stiffVar = (stiffnessEntered.text as NSString).floatValue

    springNum = springNum + 1

    submitFunc(newForce: forceVar ,newStiff: stiffVar, newSpring: springNum)

    self.dismissViewControllerAnimated(false, completion: nil)

}

}