2015-04-21 3 views
0

Я думаю, что это простая проблема, поэтому вы можете сразу перейти к вопросу.Как заставить глобальную переменную «обновлять»?

У меня есть глобальная переменная, switchStatusIndex (не относится к любому классу.):

import Foundation 

//Default 
var userIndex:[Int] = [0,1,2] 

var userIndexForItem:[Int] = [Int]() 

//Index to hold the switch status for all datatypes 
var switchStatusIndex:[String] = [ 
     NSUserDefaults.standardUserDefaults().boolForKey("switchA").description, 
     NSUserDefaults.standardUserDefaults().boolForKey("switchB").description, 
     NSUserDefaults.standardUserDefaults().boolForKey("switchC").description] 

В ViewControllerOne У меня есть функция:

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

func setupUserIndexForItem() { 
    userIndexForItem = [Int]() //clears userIndexForItem 

    for i in 0...userIndex.count-1{ 
     if switchStatusIndex[i] == "true"{ 
      userIndexForItem.append(userIndex[i]) 
     } 
    } 
} 

Наконец у меня есть ViewControllerTwo с UISwitches ex

@IBOutlet var switchA: UISwitch! 

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


override func layoutSubviews() { 
    restoreSwitchesStates() 
} 


@IBAction func setStateSwitchA(sender: UISwitch) { 
    var userdefault: NSUserDefaults = NSUserDefaults.standardUserDefaults() 

    if switchA.on == true { 
     userdefault.setBool(switchA!.on, forKey: "switchA") 

    }else if switchA.on == false { 
     userdefault.setBool(switchA!.on, forKey: "switchA") 
    } 
    userdefault.synchronize() 
} 

func restoreSwitchesStates() { 
    switchA!.on = NSUserDefaults.standardUserDefaults().boolForKey("switchA") 
} 

Когда я переворачиваю переключатель в .on, он обновляет NSUserdefault до «true». Однако, когда я возвращаюсь к ViewControllerOne, setupUserIndexForItem не отражает это изменение. Так как switchStatusIndex не обновляется.
Вопрос: Как заставить глобальную переменную «обновлять»?

+0

Ваша логика и понимание глобальной переменной неверны. Google это и посмотреть, как они работают - глобальная переменная iOS –

+0

http://stackoverflow.com/questions/3601341/iphone-global-variable –

+1

Используйте segue из ViewControllerTwo, чтобы изменить значение переменной в ViewControllerOne. Или настройте метод делегата. – Shades

ответ

0

Вы можете сделать это многими способами. Вы можете использовать switchStatusArray как глобальный, добавив Appdelegate или вы можете использовать nsnotifiation или вы можете сделать делегат.

Если вы используете уведомление, сначала сделайте метод для инициализации этого массива и использования в качестве селектора в методе уведомления.

NSNotificationCenter.defaultCenter().addObserver(
self, 
selector: "intializeSwitcharrayMethod:", 
name:"intializeSwitcharray" object: nil) 

    @objc func intializeSwitcharrayMethod(notification: NSNotification){  
    //do stuff 

     Self.intializeSwitcharraywithUserdefaults() 
    } 


    func intializeSwitcharraywithUserdefaults() 
{ 
    // your code of array intialization 
    } 

Вы можете вызвать intializeSwitcharraywithUserdefaults() из viewdidload также.

+0

Можете ли вы показать, как использовать NSNotification в этом примере? – KML

+0

Проверьте отредактированный ответ и теперь измените уведомление о методе метода switch, чтобы метод intialization вызывал – Bhoomi

0

Если я правильно понимаю ваш код, вы ожидаете, что содержимое массива switchStatusIndex будет обновляться каждый раз при доступе к этому массиву из метода viewWillAppear. Но этого не произойдет, потому что switchStatusIndex установлен только один раз и больше не меняется. Возможно, вы определили switchStatusIndex как вычисленное свойство или свойство, которое инициализируется закрытием, так что каждый раз, когда вы обращаетесь к нему, происходит что-то (содержимое массива обновляется со значениями в NSUserDefaults).

+0

точно: каждый раз, когда вы обращаетесь к нему, содержимое массива обновляется со значениями в NSUserDefaults. как это сделать? – KML

+1

Я думаю, что объяснения и примеры в [_Properties_] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14 -ID254) в разделе «Руководство по языку Swift Programming Language» очень четкое и короткое чтение. – wltrup