Какао: Избегайте постоянных обновлений в контрольных привязках - PullRequest
2 голосов
/ 31 марта 2012

У меня есть несколько панелей, которые содержат NSTextField элементы управления, привязанные к свойствам в Владельце файла *1003*.Если пользователь редактирует поле, а затем нажимает Tab , чтобы перейти к следующему полю, оно работает как положено.Однако если пользователь не нажимает Tab и просто нажимает кнопку OK, новое значение не устанавливается в объекте Владелец файла .

Для обхода проблемыэто я установил Обновления непрерывно в привязке, но это должно быть дорого (РЕДАКТИРОВАТЬ: или, по крайней мере, это не элегантно).

Есть ли способ принудительно обновить обновление, когда кнопка ОКнажимается вместо использования Обновления непрерывно ?

Ответы [ 3 ]

6 голосов
/ 01 апреля 2012

Вы правы в том, что вам не нужно использовать опцию значения постоянно обновляющихся значений.

Если вы используете привязки (которыми вы являетесь), то вам следует вызывать -commitEditing метод подкласса NSController, который управляет связыванием.Обычно вы делаете это в своем методе, который закрывает отображаемый лист.

-commitEditing говорит контроллеру завершить редактирование в активном элементе управления и зафиксировать текущие изменения в связанном объекте.

Это хорошая идея вызывать это всякий раз, когда вы выполняете операцию персистентности, такую ​​как сохранение.

3 голосов
/ 31 марта 2012

Решением этой проблемы является «завершение редактирования» в методе действия, который вызывается кнопкой OK.Поскольку панель является подклассом NSWindowController, NSWindow легко доступен, однако в вашем коде вам, возможно, придется получить NSWindow через элемент управления, который вы привязали к контроллеру;например NSWindow *window = [_someControl window].

Ниже приведена реализация моего метода действия okPressed.

В целом я считаю, что это лучше решение для установки Постоянно обновляется в связанных элементах управления.

- (IBAction)okPressed:(id)sender
{
    NSWindow *window = [self window];
    BOOL editingEnded = [window makeFirstResponder:window];
    if (!editingEnded)
    {
        logwrn(@"Unable to end editing");
        return;
    }

    if (_delegateRespondsToEditComplete)
    {
        [_delegate detailsEditComplete:&_mydetails];
    }
}
0 голосов
/ 05 февраля 2016

Хотя это действительно старая версия, я абсолютно не согласен с предположением, что этот вопрос основан на

многократном обновлении связывание абсолютно недорогоЯ думаю, вы могли бы подумать, что это постоянно обновляет значение, понимая его как «регулярно основанный на некотором интервале».

Но это не так.Это просто означает, что он обновляется всякий раз, когда вы изменяете связанное значение.Это означает, что когда вы вводите что-то в textView, оно будет обновляться по мере написания;это то, что вы хотели бы в этой ситуации.

...