Objective-C многократное предупреждение метода - PullRequest
2 голосов
/ 14 июня 2011

Я получаю предупреждение следующим способом:

- (void)tableView:(NSTableView *)aTableView
 setObjectValue:(id)anObject
 forTableColumn:(NSTableColumn *)aTableColumn
            row:(int)rowIndex
{
    NSString *identifier = [aTableColumn identifier];
    Person *person = [employees objectAtIndex:rowIndex];

    NSUndoManager *undo = [self undoManager];
    [[undo prepareWithInvocationTarget:self] tableView:aTableView setObjectValue:[person valueForKey:identifier] forTableColumn:aTableColumn row:rowIndex];
    if(![undo isUndoing])
    {
        [undo setActionName:@"Edit Person"];
    }
    [person setValue:anObject forKey:identifier];
    [tableView reloadData];
}

Я пытаюсь реализовать отмену, поэтому я решил, что вызову тот же метод и просто передам старое значение. Я получаю сообщение об ошибке: «Предупреждение: несколько методов с именем» -tableView: setObjectValue: forTableColumn: row: «found». Есть идеи почему?

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Метод в NSTableViewDataSource объявлен как:

- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex

Ваш метод использует int в качестве типа переменной rowIndex.Измените это на NSInteger, и все будет хорошо.

Основная проблема заключается в том, что Objective-C не поддерживает ковариацию или противоречивость в аргументации метода, что приводит к предупреждению.

Обратите внимание, что вы объединяете модель данных со слоем представления.Отмена таким способом будет очень, очень хитрой;если вы также не управляете стеком отмены в контексте каждого вида таблицы и / или добавления / удаления строк, отмена будет применять значение к неправильной строке.

Вы были бы далеколучше переделать приложение так, чтобы у вас было правильное разделение вида модели и контроллера.

1 голос
/ 14 июня 2011

Ну, вот что избавилось от предупреждения:

[((MyDocument *)[undo prepareWithInvocationTarget:self]) tableView:aTableView setObjectValue:[person valueForKey:identifier] forTableColumn:aTableColumn row:rowIndex];

Приведение к классу, в котором я находился, прояснило двусмысленность, которую я полагаю.

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