1

iOS アプリケーションの開発にはかなりの経験がありますが、Mac OS X アプリケーションの開発に関してはまだ初心者です。

私が抱えている問題は次のとおりです...

コンボ ボックス、複数のテキスト フィールド、2 つのテキスト ビューを備えた UI を作成しました。ユーザーが選択した NSComboBox の値を変更するたびに、現在表示されているすべての値をモデルに安全にしたいと考えています。私の現在の実装では、NSComboBoxDelegate のデリゲート メソッドを使用してデータをモデルに保存します ( -comboBoxWillPopUp: ) - 別のデリゲート メソッドを使用してデータを読み込みます ( -comboBoxSelectionDidChange: )。テキスト フィールドではすべてが期待どおりに機能しますが、テキスト ビューのデータをモデルに保存する際に問題が発生し、原因がわかりません。

NSTextView に関しては、次の問題があります。古いローカリゼーションの値をモデルに保存し、新しく選択したローカリゼーションの値をロードする代わりに、少しキャッシュが行われているようです-古いローカリゼーションの値ローカリゼーションは、テキストビューで新しく選択されたローカリゼーションにコピーされ、これはデータ モデルでも発生します。

ビューコントローラー:

- (void)comboBoxSelectionDidChange:(NSNotification *)notification
{    
    NSInteger index = [comboBox indexOfSelectedItem];
    NSString *selectedLocale = [supportedLocales objectAtIndex:index];

    text = [deal valueForContentItemWithType:SDDealContentItemTypeTitle locale:selectedLocale];
    titleField.stringValue = text ? text : @"";

    text = [deal valueForContentItemWithType:SDDealContentItemTypeText locale:selectedLocale];
    textView.string = text ? text : @"";
}

- (void)comboBoxWillPopUp:(NSNotification *)notification
{
    NSInteger index = [comboBox indexOfSelectedItem];
    NSString *selectedLocale = (index != NSUIntegerMax) ? [supportedLocales objectAtIndex:index] : [supportedLocales objectAtIndex:0];

// works fine ...

    text = titleField.stringValue;
    [deal setValue:text forContentItemWithType:SDDealContentItemTypeTitle locale:selectedLocale]; 

// has issues ...

    text = textView.string;
    [deal setValue:text forContentItemWithType:SDDealContentItemTypeText locale:selectedLocale]; 
}

モデル:

- (id)valueForContentItemWithType:(SDDealContentItemType)type locale:(NSString *)locale
{
    SDDealContentItem *item = [self contentItemWithType:type locale:locale];

    return item ? item.value : nil;
}

- (void)setValue:(id)value forContentItemWithType:(SDDealContentItemType)type locale:(NSString *)locale
{    
    SDDealContentItem *item = [self contentItemWithType:type locale:locale];
    if (!item)
    {
        SDDealContentItem *item = [SDDealContentItem contentItemWithType:type locale:locale];
        item.value = value;

        self.items = [self.items arrayByAddingObject:item];

        return;
    }

    item.value = value;
}
4

0 に答える 0