2013-04-10 77 views
3

我正在構建一個表,以在我的偏好設置面板中顯示一些數據。所有的數據都在NSUserDefaults中。表格中有一個複選框,可以啓用/禁用列出的設備的數據。該複選框是唯一可編輯的單元格。將複選框綁定到共享用戶默認值

該表正確顯示共享用戶默認值中的數據。所以我知道我已將表格內容正確地映射到正確的共享用戶默認模型關鍵路徑。但是,當我切換複選框時,新數據根本不會寫入默認值。

這裏是一個複選框設置的一瞥......

enter image description here

我試圖分配選擇動作的NSButton(複選框),以爲我可以編程設置爲默認值。奇怪的是,這個動作從來沒有被觸發。我設置了一個簡單的動作,只是做了一個NSLog。點擊複選框時它從未被解僱。

更新:因此,您可以看到我的默認數據結構是什麼樣子,下面是defaults命令的輸出。這張表背後並沒有真正的代碼。

{ 
    ClimateDeviceData =  (
       { 
      deviceName = Nest; 
      deviceSetting = "76"; 
      display = 1; 
      structure = Home; 
      uuid = d01AA02AB145204VR; 
     } 
    ); 
    ClimateLoginAtLaunch = 1; 
    ClimateMenuBarIconStyle = "Nest Temp Settings"; 
} 

更新#2:在這一點上,我會接受的只是能夠從複選框調用一個選擇的解決方案。

+0

目前還不清楚在什麼水平你已經綁定的實現代碼如下單元視圖中的數據,但它可能需要另一個層次高? ClimateDeviceData.display? – 2013-04-11 17:50:27

+0

表視圖綁定到共享用戶默認值控制器,並且模型關鍵路徑已被設置爲'ClimateDeviceData'。 – 2013-04-11 18:09:18

回答

1

如果您沒有將NSButton(複選框)綁定到Shared User Defaults Controller而不是圖片上,那麼Table Cell View

+0

我嘗試了很長一段時間,甚至永遠無法獲得要顯示的數據。儘管我將表視圖綁定到共享用戶默認值控制器。 – 2013-04-11 03:24:39

0

是的,這與基於視圖的表格視圖不同。 (我只是自己學習。)在基於視圖的表格視圖中,表格單元視圖的objectValue是由該行表示的對象。您將文本字段,複選框等綁定到該objectValue的keypath。

1

我在應用程序中做了大致相同的事情。不完全,但基本原理是一樣的。一個填充了綁定的表格和一個按鈕(可以是複選框或另一個按鈕,並不重要)。

我嘗試了按鈕上的動作,但它也不起作用,所以最後我使用了KVC概念。

  • 我在XIB中使用了一個arrayController,在我的代碼中引用了一個可變數組,它存儲了具有狀態屬性(boolean)的自定義對象的幾個實例。
  • 基於視圖的tableview通過使用arrangedObjects控制器鍵綁定到arrayController。
  • 該按鈕綁定到tableCellView(排列的對象),使用keyPath:objectValue.status(有效地獲取該行上的自定義對象的狀態屬性)。

以我控制器代碼,我使用下列行來創建可變數組保持自定義對象:

smartApp *appFound = [[smartApp alloc] initWithApplicationIdentifier:key]; 

    if (appFound) 
    { 
     [appFound setStatus:[NSNumber numberWithBool:YES]]; 

     [appFound addObserver:self 
       forKeyPath:@"status" 
        options:(NSKeyValueObservingOptionNew | 
          NSKeyValueObservingOptionOld) 
        context:NULL]; 

     [_appsArray addObject:appFound]; 
    } 

我關於該對象的「狀態」的keyPath添加觀察者。我添加待處理的代碼,觀察對象是否發生值更改:

- (void)observeValueForKeyPath:(NSString *)keyPath 
        ofObject:(id)anObject 
        change:(NSDictionary *)change 
        context:(void *)context 
{ 
    if ([anObject isKindOfClass:[smartApp class]]) 
    { 
     if ([keyPath isEqual:@"status"]) 
     { 
      NSLog(@"Clicked on row: %lu", (unsigned long)[self.appsArray indexOfObject:anObject]); 
     } 
    } 
} 

一旦進入方法,您可以執行所需操作。它肯定會被調用,並且會得到與您單擊的行,更改字典和鍵路徑匹配的對象。

希望幫助