【问题标题】:Swift: Updating a label from a second view controllerSwift:从第二个视图控制器更新标签
【发布时间】:2015-06-05 22:39:31
【问题描述】:

我有两个视图控制器。我还有一个名为number 的通用变量。第一个视图控制器上有一个名为mainLabel 的标签。我的第二个视图控制器上有一个按钮。当按下按钮时,它应该从变量 number 中减去 200,然后更新 mainLabel 标签。我不知道如何使mainLabel 成为也适用于第二个视图控制器的标签。

第一个视图控制器

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.
    }

 }

第二个视图控制器

import UIKit

class SecondViewController: UIViewController {

    @IBOutlet weak var buy1Label: UILabel!

    @IBAction func buy1(sender: AnyObject) {

        number = number - 200

        buy1Label.text = "Bought!"

        mainLabel.text = "\(number)"

    }

}

【问题讨论】:

  • 我建议使用 NSDefaultUser 存储您的号码,一旦您更新您的“号码”,发布 NSNotification,以便观察者收到通知。
  • @antonio081014 我是 Xcode 的新手,你能解释一下该怎么做吗?
  • 您正在使用 segues 浏览两个 UIViewControllers
  • @antonio081014 那……只是……不……请不要那样做……
  • @nhgrif 我有理由吗?

标签: swift uilabel viewcontroller


【解决方案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")
}

}

希望这对你有用。

【讨论】:

    【解决方案2】:

    哇,这个问题切入了我每天必须处理的核心问题。这是我对如何使用通知执行此操作的第一个看法。

    首先,设置一些通用的全局事物。

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

    第一个视图控制器拆分设置编号和设置标签的角色。

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

    现在第二个视图控制器完全不用担心第一个视图控制器了。

    class SecondViewController: UIViewController {
    
        @IBOutlet weak var buy1Label: UILabel!
    
        @IBAction func buy1(sender: AnyObject) {
    
            setNumber(number() - 200)
    
            buy1Label.text = "Bought!"
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      相关资源
      最近更新 更多