簡體   English   中英

Swift:具有全局變量的屬性觀察器

[英]Swift: Property observer with a global variable

我有兩個文件 ,在其中一個文件中,將變量設置為“ 單擊按鈕時 ”。

class Home: UIViewController {

    var swipeNumber = 99

    @IBAction func pressedThreeSwipes(sender: AnyObject) {
        swipeNumber = 3
    }
}

然后在第二個文件( 用作第二個視圖 )中,我有一個didSet屬性觀察器 ,它正在檢查變量swipeNumber的更改

func didMoveToView(view: UIView) {
    /* Setup your scene here */

    var menu = Home()

    var swipeNumber: Int = 0 {
        didSet {
            println("\(menu.swipeNumber) should be three.")
        }
    }
}

但是, 當您運行該程序時println行不會運行這表明變量swipeNumber尚未更改

因此,我認為這將是屬性觀察器中= 0的問題,但是如果刪除它,則會收到有關沒有初始化程序的錯誤。

但是, 經過仔細檢查 ,我意識到了問題所在。 由於didSet代碼實際上並未“執行任何操作”,因此我知道它無法識別變量中的更改 我認為這是因為在視圖加載之前單擊了按鈕並且變量“已更改” ,即必須在打開第二個視圖的情況下更改變量 我認為問題出在我要安置財產觀察員的地方 也許我應該將其放在AppDelegate或其他地方,並將其鏈接到第二個視圖?

您能給我的任何建議將不勝感激。

先感謝您。

編輯1:按照@utahwithak的建議,我在AppDelegate文件中放置了一個屬性觀察器:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    var swipeNumber: Int = 0 {
        didSet {
            println("\(swipeNumber)")
        }
    }
}

我也menu更改為appDelegate 現在,當我按下pressedThreeSwipes時,我收到消息“ 3”。 但是,當我轉到下一個視圖並播放時,另一條消息告訴我swipeNumber =0。我認為這與AppDelegate文件中屬性觀察器第一行有關 謝謝。

在第一個文件中,它設置了沒有didSet的本地成員變量,這與第二個文件中的swipeNumber不同,並且設置為不會觸發第二個文件中的didSet。

在文件2中是復制粘貼錯誤,還是在函數中聲明了menuswipeNumber 如果它們在函數中很可能是錯誤的位置,則對於類成員,它們應該與函數處於同一級別;對於全局變量,它們應位於類聲明的外部。

我不確定我了解您要完成的工作,但是如果您希望文件2知道文件1的信息,則有許多方法可以不使用全局變量。 例如文件1調用didSet或通過NSNotificationCenter發布NSNotification的委托

編輯代表示例

在文件1中,您可以在類聲明之外添加類似的內容

protocol SwipeNumberDelegate{
    func swipeNumberChanged(newVal:Int)
}

那么在您的文件1類內部將有這樣的內容

class Home: UIViewController {
    var swipeDelegate:SwipeNumberDelegate? = nil
    var swipeNumber = 99{
         didSet{
            if let delegate = self.swipeDelegate{
                delegate.swipeNumberChanged(self.swipeNumber)
            }
         }
    }
 ...
}

從文件1或文件2以某種方式必須設置swipeDelegate

在類聲明的文件2中,您必須通過使其看起來像這樣來使其符合協議:

class mySecondClass:SuperClass, SwipeNumberDelegate

並實施協議

func swipeNumberchanged(newVal:Int){
    println("Number Changed:\(newVal)")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM