2011-10-21 14 views
3

私は、Locationというモデルオブジェクトを使用するコアデータアプリケーションを開発しています。ユーザーは場所を入力し、緯度と経度を10進形式で入力できます。私はこれに平文NSTextFieldsを使用します。ユーザへのフィードバックとして、度数/分/秒の対応も表示されます(ラベルを使用)。 10進形式から次数などに変換するロジックは、NSManagedObjectのサブクラスであるLocationモデルオブジェクトで実装されます。コアデータアプリケーションで読み取り専用属性を実装する方法

理想的には、これらを読み取り専用属性として実装して、何らかの方法で小数点に結びつけたいので、ユーザーが小数点の表示を変更すると度/分/秒の表示も更新されます。

  • は、編集内容を傍受するNSTextFieldDelegateとして、コントローラを設定しますが、ユーザーが実際にフィールドを編集している場合のみ動作:

    は、私は、次の試してみました。これは、ユーザーが実際に有効な場所である緯度と経度の両方の既定値として0を受け入れると失敗します。

  • 私はこれにアプローチする方法上の任意のアイデアをコアデータのための一時属性に見えたが、彼らはこのための答えかもしれませんが、この点についてのドキュメントは非常に有用ではないた...

ましたか?

EDIT:フランシスマグリューによって示唆されるように

、私はLocationのために次のクラスメソッドを実装し:

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { 
    NSSet *result = [super keyPathsForValuesAffectingValueForKey:key]; 

    if ([key isEqualToString:@"latitudeToDegrees"] || [key isEqualToString:@"longitudeToDegrees"]) { 
     result = [result setByAddingObjectsFromSet:[NSSet setWithObjects: @"latitude", @"longitude", nil]]; 
    } 
    return result; 
} 

彼の答えとは少し異なり、DMSはただ一つの属性がフォーマット文字列として表現されますLocationで計算されます。その後、UIのバインディングをlatitudeToDegreeslongitudeToDegreesに追加しました。うーん!、うまく更新されたUI。

答えて

0

誰かが私に一時的なプロパティを説明できるのであれば、私もそれを聞いてみたいです。

DMSは緯度と経度から簡単に計算されるので、これらの値をモデルの属性として格納する本当の理由はありません。保存された緯度と経度の属性に基づいて、現在の度、分、秒を計算して返すメソッドを記述するだけです。

はその後、あなたの場所のクラスに次のメソッドを実装し、コアデータが自動的に変更のoberversを通知しました:

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { 
    NSSet *result = [super keyPathsForValuesAffectingValueForKey:key]; 

    if ([key isEqualToString:@"degrees"] || 
     [key isEqualToString:@"minutes"] || 
     [key isEqualToString:@"seconds"]) { 

     result = [result setByAddingObjectsFromSet:[NSSet setWithObjects: 
      @"latitude", @"longitude", nil]]; 
    } 
    return result; 

}

は、この「一過性」度というコアデータを伝え、分と秒は緯度と経度の属性に依存します。バインディングを使用していると仮定すると、ユーザーインターフェイスは自動的に更新されます。ユーザーがテキストフィールドを編集できないようにするには、XIBでその動作を「選択可能」または「なし」に設定します。 (XCode 3では「編集可能」のチェックボックスを外すだけだと思う​​)

+0

華麗な!!ありがとう。 – Roger

関連する問題