Аарон Хиллегасс _Кокоа Программирование для Mac OS X_ Глава 9 Вопрос - PullRequest
5 голосов
/ 03 февраля 2010

В Aaron Hillegass ' Программирование какао для Mac OS X , глава 9, раздел «Начать редактирование при вставке», он объясняет, как именно это сделать. Однако меня смутило то, что он сделал кучу других вещей. Вот полный список кодов:

- (IBAction)createEmployee:(id)sender
{
NSWindow *w = [tableView window];

// Try to end any editing that is taking place
BOOL editingEnded = [w makeFirstResponder:w];
if (!editingEnded) {
    NSLog(@"Unable to end editing");
    return;
}
NSUndoManager *undo = [self undoManager];

// Has an edit occurred already in this event?
if ([undo groupingLevel]) {
    // Close the last group
    [undo endUndoGrouping];
    // Open a new group
    [undo beginUndoGrouping];
}
// Create the object
Person *p = [employeeController newObject];

// Add it to the content array of 'employeeController'
[employeeController addObject:p];
[p release];
// Re-sort (in case the user has sorted a column)
[employeeController rearrangeObjects];

// Get the sorted array
NSArray *a = [employeeController arrangedObjects];

// Find the object just added
int row = [a indexOfObjectIdenticalTo:p];
NSLog(@"starting edit of %@ in row %d", p, row);

// Begin the edit in the first column
[tableView editColumn:0
                  row:row
            withEvent:nil
               select:YES];
}

У меня есть два вопроса по этому поводу:

1) Откуда ты знаешь, что должен делать все это? Есть ли «контрольный список» или что-то в документации Apple? Опыт

2) Разве это не разрушает всю цель контроллера массива, если вам все еще приходится переписывать все методы самостоятельно?

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

NSWindow *w = [tableView window];

// Try to end any editing that is taking place
BOOL editingEnded = [w makeFirstResponder:w];
if (!editingEnded) {
    NSLog(@"Unable to end editing");
    return;
}
NSUndoManager *undo = [self undoManager];

// Has an edit occurred already in this event?
if ([undo groupingLevel]) {
    // Close the last group
    [undo endUndoGrouping];
    // Open a new group
    [undo beginUndoGrouping];
}

Ответы [ 3 ]

4 голосов
/ 03 февраля 2010

1) Откуда ты знаешь, что должен делать все это?Есть ли «контрольный список» или что-то в документации Apple?Опыт?

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

Этот код появился бы в результате одного или нескольких сообщений об ошибках.Другими словами, изначально вы не придумали бы этот код, но в конечном итоге это сделали бы.

Попробуйте сами.Удалите этот код и посмотрите, сможете ли вы обнаружить проблемы в работающем приложении.Решение этих проблем требует сочетания знаний SDK и навыков отладки.Оба растут с опытом.

2) Разве это не противоречит всей цели контроллера массива, если вам все еще приходится переписывать все методы самостоятельно?

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

2 голосов
/ 03 февраля 2010

1) Он делает вещи, которые реализуют функции, требуемые его программой. Это не так уж сильно для Apple (например, какие методы делегирования я должен реализовывать при соблюдении такого-то протокола), но это поток его программы . Вероятно, существует миллион способов решения этой проблемы.

2) Не уверен, что вы имеете в виду, но он, кажется, использует много встроенных методов - я не вижу его действительно изобретающего колесо (пример:)

Person *p = [employeeController newObject];

// Add it to the content array of 'employeeController'
[employeeController addObject:p]; // <-- built in method
[p release]; // <-- built in method
// Re-sort (in case the user has sorted a column)
[employeeController rearrangeObjects]; // <-- built in method

// Get the sorted array
NSArray *a = [employeeController arrangedObjects]; // <-- built in method

// Find the object just added
int row = [a indexOfObjectIdenticalTo:p]; // <-- built in method

РЕДАКТИРОВАТЬ

Хорошо, так что для первого сообщения w, [w makeFirstResponder: w]; отсюда мы можем найти (http://developer.apple. .. NSWindow / makeFirstResponder ), что экземпляр NSWindow поддерживает сообщение makeFirstResponder. Я понимаю, что делать это с NSWindow так, что когда пользователь взаимодействует с ним, он будет первым респондентом, другими словами, он получит какие-либо действия для NSWindow. И под этим я подразумеваю «ш».

1) Откуда ты знаешь, что должен делать все это? Есть ли «контрольный список» или что-то в Apple док? Опыт?

Отличный вопрос - я думаю, что он приходит с опытом и работой со всеми типами классов и элементами управления пользовательским интерфейсом. хех =] я не знаю ... может быть, у кого-то есть лучший ответ. Я хотел бы учиться!

Нашел хорошую ссылку: http://www.cocoadev.com/index.pl?FirstResponder

1 голос
/ 03 февраля 2010

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

...