Objective-C多方法警告

Objective-C多方法警告,objective-c,Objective C,我通过以下方法得到警告: - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { NSString *identifier = [aTableColumn identifier]; Person *person = [employees

我通过以下方法得到警告:

- (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];
}

我正在尝试实现undo,所以我想我会调用相同的方法,只传递旧的值。我得到的错误是“警告:名为'-tableView:setObjectValue:forTableColumn:row:'found'的多个方法”。知道为什么吗?

好吧,以下是摆脱警告的原因:

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

对我所在的类进行强制转换消除了我认为的歧义。

NSTableViewDataSource上的方法声明为:

- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
您的方法使用
int
作为
rowIndex
变量的类型。将其更改为
NSInteger
,一切都会好起来

根本问题是Objective-C在方法论证中不支持协方差或反方差,从而导致警告


还请注意,您正在将数据模型与视图层合谋。以这种方式撤销将是非常非常棘手的;如果不在每种表的上下文和/或行的添加/删除中管理撤消堆栈,撤消将把值应用到错误的行


您最好重新设计应用程序,使模型视图和控制器正确分离。

解决了问题。这是一个小示例应用程序。我想如果我这样做,通常会有一个单独的控制器类(我没有使用NSController或bindings),但是这样做如何避免我不得不管理撤销堆栈呢?我不是每次添加/删除/编辑某个内容时都必须管理撤消堆栈吗?这不会阻止您管理撤消堆栈,但它会将撤消堆栈管理主要移动到数据/控制器层,这将大大降低脆弱性。更好的是,您应该能够利用Cocoa中内置的各种控制器,使所有这些都变得更加简单和灵活(或者,甚至是核心数据——我使用核心数据来处理死气沉沉的简单应用程序,只是因为它消除了几乎所有的代码).我的理解是,只有Mac OS支持NSController和绑定之类的东西,而且如果您正在编写遗留的东西/iOS,您就没有这些类可以使用。我知道它们很有用,但如果我不能使用它们,我想知道其他的事情。绑定只是Cocoa。不过,iOS有很多不同的控制器。请看一个例子。