0

I have two view controllers. I also have a universal variable called number. The first view controller has a label on it called mainLabel. My second view controller has a button on it. When the button is pressed it should subtract 200 from the variable number then update the mainLabel label. I can not figure out how to make mainLabel a label that works on the second view controller too.

First View Controller

import UIKit

var number:Int = 0

class ViewController: UIViewController {

    @IBOutlet weak var mainLabel: UILabel!

    @IBAction func backgroundButton(sender: AnyObject) {

        number = number + 1

        mainLabel.text = "\(number)"

         NSUserDefaults.standardUserDefaults().setObject(number,     forKey: "number")

    }

   override func viewDidLoad() {
        super.viewDidLoad()

        if NSUserDefaults.standardUserDefaults().objectForKey("number")     != nil {

            number =     NSUserDefaults.standardUserDefaults().objectForKey("number") as! Int

        }

        mainLabel.text = "\(number)"

    }

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

 }

Second View Controller

import UIKit

class SecondViewController: UIViewController {

    @IBOutlet weak var buy1Label: UILabel!

    @IBAction func buy1(sender: AnyObject) {

        number = number - 200

        buy1Label.text = "Bought!"

        mainLabel.text = "\(number)"

    }

}
nhgrif
  • 61,578
  • 25
  • 134
  • 173
  • What I suggest would be using NSDefaultUser to store your number, once you update your 'number', post a NSNotification, so the observer would be notified. – antonio081014 Jun 05 '15 at 22:49
  • @antonio081014 I'm new to Xcode, could you explain a little more on what to do? –  Jun 05 '15 at 22:52
  • You are navigating through the two `UIViewControllers` using segues ? – Victor Sigler Jun 05 '15 at 23:10
  • @antonio081014 That... is just... no... please don't do that... – nhgrif Jun 05 '15 at 23:23
  • @nhgrif May I have the reason? – antonio081014 Jun 05 '15 at 23:25
  • possible duplicate of [How do you share data between view controllers and other objects in Swift?](http://stackoverflow.com/questions/29734954/how-do-you-share-data-between-view-controllers-and-other-objects-in-swift) – nhgrif Jun 05 '15 at 23:28
  • Are the view controllers on the screen at the same time? Why is an action on view controller A supposed to be updating something on view controller B? Either this needs to all be the same view controller, or the updater needs to get the initial value, and then pass back the updated value when it's done. – nhgrif Jun 05 '15 at 23:32
  • @nhgrif as he asked, one variable, so I don't see any problem with my solution. – antonio081014 Jun 05 '15 at 23:40

2 Answers2

-1
class ViewController: UIViewController {

@IBOutlet weak var mainLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    NSNotificationCenter.defaultCenter().addObserverForName("NSNotificationName", object: nil, queue: nil) { (note) -> Void in
        // Number changed, update your UILabel.
        var number: Int = NSUserDefaults.standardUserDefaults().integerForKey("keyOfNumber")
        self.mainLabel.text = "\(number)"
    }
}

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


@IBAction func subtractNumberBy200() {
    var number: Int = NSUserDefaults.standardUserDefaults().integerForKey("keyOfNumber")
    number -= 200
    NSUserDefaults.standardUserDefaults().setInteger(number, forKey: "keyOfNumber")
}

}

Hope this will works for you.

antonio081014
  • 3,553
  • 1
  • 30
  • 37
-1

Wow, this question cuts to the core of what I have to deal with every day. Here is my first take on how to do this with notifications.

First, setup some common global things.

let NumberDidChangeNote = "NumberDidChangeNote" // A name for the notification.

// A function to get the value of number the same way every time.
func number() -> Int {
    return NSUserDefaults.standardUserDefaults().integerForKey("number");
}

// A function to set the value of number the same way every time.
func setNumber(number: Int) {
    NSUserDefaults.standardUserDefaults().setInteger(number, forKey: "number")
    NSUserDefaults.standardUserDefaults().synchronize()

    // Post a number did change notification
    NSNotificationCenter.defaultCenter().postNotificationName(NumberDidChangeNote, object: nil)
}

The first view controller splits the roles of setting number and setting the label.

class ViewController: UIViewController {

    @IBOutlet weak var mainLabel: UILabel!

    @IBAction func backgroundButton(sender: AnyObject) {

        setNumber(number() + 1)

    }

    dynamic func numberDidChange(note: NSNotification) {

        mainLabel.text = "\(number())"

    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        // Add an observer which will call numberDidChange() anytime the number changes.
        let center = NSNotificationCenter.defaultCenter()
        center.addObserver(self, selector: "numberDidChange", name: NumberDidChangeNote, object: nil)

        // Fake an initial notification to numberDidChange() to set the initial value of the label.
        numberDidChange(NSNotification(name: NumberDidChangeNote, object: nil))
    }

    override func viewWillDisappear(animated: Bool) {

        // Remove the observer when not on the screen.
        let center = NSNotificationCenter.defaultCenter()
        center.removeObserver(self, name: NumberDidChangeNote, object: nil)

        super.viewWillDisappear(animated)
    }

}

Now the second view controller doesn't have to worry about the first view controller at all.

class SecondViewController: UIViewController {

    @IBOutlet weak var buy1Label: UILabel!

    @IBAction func buy1(sender: AnyObject) {

        setNumber(number() - 200)

        buy1Label.text = "Bought!"

    }

}
Jeffery Thomas
  • 42,202
  • 8
  • 92
  • 117