3

環境設定ペインにデータを表示するテーブルを作成しています。すべてのデータは NSUserDefaults にあります。表には、リストされたデバイスのデータを有効/無効にするチェックボックスがあります。チェックボックスは、編集可能な唯一のセルです。

表には、共有ユーザーのデフォルトのデータが正しく表示されています。したがって、テーブル コンテンツが正しい共有ユーザー デフォルト モデル キー パスに適切にマップされていることがわかります。ただし、チェックボックスを切り替えると、新しいデータがデフォルトにまったく書き込まれません。

ここでは、チェックボックスのセットアップを垣間見ることができます...

ここに画像の説明を入力

プログラムでデフォルトを設定できると考えて、NSButton (チェックボックス) にセレクター アクションを割り当ててみました。奇妙なことに、アクションは決してトリガーされません。NSLog を実行しただけの単純なアクションをセットアップしました。チェックボックスをクリックしても起動されませんでした。

更新:私のデフォルトのデータ構造がどのように見えるかを確認できるように、ここに defaults コマンドからの出力を示します。このテーブルの背後にあるコードは実際にはありません。

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

更新 #2 : この時点で、単にチェック ボックスからセレクターを呼び出すことができるという解決策を受け入れます。

4

3 に答える 3

1

NSButton(チェックボックス) を図のShared User Defaults Controller代わりに にバインドしないでくださいTable Cell View

于 2013-04-11T00:28:06.033 に答える
1

私はアプリでほぼ同じことをしています。正確ではありませんが、基本原理は同じです。バインディングが設定されたテーブルと、そこにあるボタン (チェック ボックスでも別のボタンでもかまいません)。

ボタンのアクションを試してみましたが、うまくいかなかったので、最後に KVC の概念を使用しました。

  • ステータス プロパティ (ブール値) を持つカスタム オブジェクトの複数のインスタンスを格納するコード内の変更可能な配列を参照する XIB で arrayController を使用します。
  • ビューベースのテーブルビューは、arrangedObjects コントローラー キーを使用して arrayController にバインドされます。
  • ボタンは、その keyPath: objectValue.status を使用して、tableCellView (配置されたオブジェクト) にバインドされます (その行のカスタム オブジェクトの 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];
  }

そのオブジェクトの「ステータス」キーパスにオブザーバーを追加します。そして保留中のコードを追加し、オブジェクトの値の変化を観察します。

- (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]);
        }
    }
}

メソッドに入ったら、やりたいことができます。必ず呼び出され、クリックした行に一致するオブジェクト、変更辞書、およびキーパスを取得します。

それが役立つことを願っています

于 2013-09-24T07:46:04.420 に答える
0

ええ、ビューベースのテーブル ビューの場合は異なります。(私はこれを自分で学んでいます。) ビューベースのテーブル ビューでは、テーブル セル ビューの objectValue は、その行によって表されるオブジェクトです。テキストフィールド、チェックボックスなどをそのobjectValueのキーパスにバインドします。

于 2013-04-11T04:24:02.660 に答える