2011-10-03 52 views
1

我有兩個視圖控制器,我想在它們之間共享一個布爾變量。 所以我創建了一個布爾變量與兩側@propery(非原子,分配),並在一面我寫在兩個視圖控制器之間共享一個布爾變量/ NSNUmber

newVC.myBool1 = self.myBool2; 

在其他視圖控制器我可以讀通過布爾變量的值,但我需要在第二個視圖控制器中更改它,以便我可以在第一個視圖控制器中讀取該值。 所以我知道,這是不可能的,因爲`布爾*它是一種原始類型。

所以我用NSNumber,但這也行不通。在第一個視圖控制器我設置viewDidLoad

self.myBool1 = [NSNumber numberWithBool:NO]; 

在第二個視圖控制器:

self.myBool2 = [NSNumber numberWithBool:YES]; 

但是第一視圖控制器的值是0上 - NO ......如此看來,創建新的NSNumber不會共享給第一個視圖控制器。

我能做些什麼來解決這個問題? Regards Tim

+0

@property(nonatomic,readwrite)for bool – Narayana

+0

我改變了這兩個視圖控制器,但它不起作用。我認爲它通過布爾參數作爲價值而不是參考? – Tim

回答

0

您有很多選擇,但您應該使用哪個取決於兩個viewControllers是否需要有關值更改時間的通知。

如果你不需要通知,最簡單的選擇是使用全局變量BOOL,雖然純粹主義者會嘲笑這個建議。但實際上這是兩行代碼,你完成了。另一種選擇是將值存儲在NSUserDefaults中。

如果您需要在每個viewController中更改通知,也許最簡潔的設計是在一個viewController中編寫一個「set」方法,該方法在其自身和另一個viewController中設置值。喜歡的東西:

-(void) setMyBool:(BOOL)newValue 
{ 
    myBool = newValue; 
    otherViewController.myBool = newValue; 
} 

如果您想將價值從任的viewController改變,它變得有點麻煩,因爲你必須有各自的viewController保持到其他的引用,並確保不設定值時,遞歸。喜歡的東西:

-(void) setMyBool:(BOOL)newValue 
{ 
    if (self.busyFlag == YES) 
    return; 
    self.busyFlag = YES; 
    myBool = newValue; 
    otherViewController.myBool = newValue; 
    self.busyFlag = NO; 
} 

另一個選擇是使用NSNotifications更改數值,讓每個類的viewController監聽變更通知。 TheEye建議編寫一個包裝類,並在viewController中保持對該類的實例的引用也可以。

但是,如果您不需要更改通知,那麼我會創建一個全局變量BOOL,並繼續處理應用程序的其他部分,因爲它非常容易,可靠且難以搞砸。

+0

我不能使用布爾指針嗎? – Tim

+0

當然,如果它讓你開心。你必須小心,當viewController處於活動狀態時,指向的BOOL不會消失,這就是爲什麼我認爲全局更安全。 – EricS

0

NSNumber對象是不可變的,所以你不能像那樣使用它。如果你寫[NSNumber initWithxxx],實際上你創建了一個新的對象。

如果你想分享一個numberboolean幾個類之間,你應該創建getter和setter方法爲布爾值(或子類NSNumber)自己的包裝類。你可以在課堂上分享這個課程。

+0

還有其他簡單的解決方案嗎? – Tim

+0

它沒有得到任何簡單 - 你需要一個可變對象分享。根據你想要對共享變量做什麼,其他解決方案可能更適合(比如值管理對象或單例),但並不簡單。 – TheEye

相關問題