Aaron Hillegass _Cocoa программирующий для Mac OS вопрос о главе 9 X_

В Программировании Какао 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];
}
5
задан chrisgoyal 3 February 2010 в 03:43
поделиться

3 ответа

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

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

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

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

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

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

4
ответ дан 14 December 2019 в 08:50
поделиться

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

2
ответ дан 14 December 2019 в 08:50
поделиться

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

1
ответ дан 14 December 2019 в 08:50
поделиться