выбор и редактирование нового объекта в NSTableView - PullRequest
3 голосов
/ 12 марта 2012

Я пытаюсь выбрать и отредактировать свойство name для вновь добавленного объекта.

В OSX у меня есть контроллер массива, который отображает его содержимое в виде таблицы. У меня есть значения столбца таблицы, связанные (используя привязки) через свойства AC. Кроме того, я установил привязки содержимого табличного представления и selectionIndexes, чтобы они указывали на AC.

Мой подклассный AC имеет IBOutlet для табличного представления (называемого tableView) и содержит управляемые объекты из модели данных.

В моем AC я переопределяю метод add :.

- (void)add:(id)sender {
    [super add:sender];
    [[self managedObjectContext] processPendingChanges]; // no effect
    [tableView reloadData]; // no effect
    [tableView scrollRowToVisible:[[self arrangedObjects] count]-1];
}

Вновь добавленный объект появляется в табличном представлении в выбранном состоянии (у меня в AC установлен AC для выбора вновь вставленных объектов). Но табличное представление прокручивается вниз ко второй последней строке, помещая новую строку сразу за видимым представлением.

Когда я пытаюсь это сделать,

[tableView scrollRowToVisible:[tableView selectedRow]];

или это,

[tableView scrollRowToVisible:[self selectionIndex]];

становится еще хуже: выборочный индекс не обновляется корректно.

- (void)add:(id)sender {
    [super add:sender];
    NSLog(@"selectionIndex = %lu", [self selectionIndex]);
    NSLog(@"number of objects in AC = %lu", [[self arrangedObjects] count]);
}

Запись selectionIndex показывает, что он всегда показывает предыдущий индекс выбора. Регистрация количества объектов в АС всегда слишком мала.

Я пытаюсь манипулировать представлением таблицы слишком рано? Любые идеи, какой метод лучше подходит для переопределения?


О редактирующей части ..

Следующая инструкция мешает вышеуказанному scrollRowToVisible: методу, поскольку последний аргумент, похоже, также выбирает строку.

[tableView editColumn:0 row:0 withEvent:nil select:YES];

Во всяком случае, указанное поле (для целей тестирования первой строки таблицы), похоже, переходит в режим редактирования на мгновение, но затем сразу же завершает редактирование.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Одно решение, которое я придумал:

- (void)rearrangeObjects {
    [super rearrangeObjects];
    [tableView editColumn:0 row:[self selectionIndex] withEvent:nil select:YES];
}

Последний аргумент select:YES не прокручивает таблицу до строки и не выделяет строку. Следующая строка прокручивает и табличное представление.

[tableView editColumn:0 row:[self selectionIndex] withEvent:nil select:NO];

select:YES выделяет текст в текстовом поле, которое редактируется.

Тем не менее, мне интересно, правильно ли я поступаю по этому поводу. Это решение требует, чтобы у каждого контроллера массива был выход к табличному представлению, которое отображает его данные. Это представляется излишним, поскольку табличное представление (и его столбцы) уже были привязаны к AC.

Попытка реализовать шаблон проектирования MVC, не должна ли ответственность за редактирование ячейки быть делегирована представлению таблицы?

1 голос
/ 12 марта 2012

Проблема в том, что контроллер массива не добавляет новый объект немедленно. Документация для - [NSArrayController add:] говорит:

Начиная с Mac OS X v10.4, результат этого метода откладывается до следующей итерации runloop, так что ошибка представления механизм (см. Ответчики ошибок и Восстановление ошибок) может обеспечить обратная связь в виде листа.

Я не знаю ни одного элегантного способа обойти это. Вы можете попробовать обойти метод add:, добавив объект непосредственно к NSMutableArray, к которому привязан контроллер массива. В качестве альтернативы вы можете попробовать использовать performSelector:withObject:afterDelay: с небольшой задержкой, например, 0,1 секунды, после чего объект должен быть добавлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...