NSComboBox & NSTextView: сохранить значение просмотра текста в модели при изменении значения поля со списком - PullRequest
1 голос
/ 13 января 2012

Хотя у меня достаточно опыта в разработке приложений для iOS, я все еще новичок в разработке приложений для Mac OS X.

Проблема, с которой я сталкиваюсь, заключается в следующем...

Я создал пользовательский интерфейс со списком, несколькими текстовыми полями и двумя текстовыми представлениями.Всякий раз, когда пользователь изменяет выбранное значение 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;
}
...