2011-06-14 58 views
2

我收到一个警告在下面的方法:Objective-C的多个方法警告

- (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”的多个方法。任何想法为什么?

回答

1

上NSTableViewDataSource的方法被声明为:

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

你的方法使用int作为rowIndex变量的类型。改为NSInteger,一切都会好的。

潜在的问题是Objective-C不支持方法论证中的方差或反方差,导致警告。


另请注意,您正在与视图层勾结数据模型。以这种方式撤消会非常棘手;如果您还没有在每种表格的上下文和/或行的添加/删除的上下文中管理撤消堆栈,则撤消操作会将该值应用于错误的行。

如果你对模型视图和控制器进行了适当的分离,那么重做你的应用会更好。

+0

解决了这个问题。这是一个小例子应用程序。我想通常如果我这样做,我会有一个单独的控制器类(我没有使用NSController或绑定),但如何防止我不得不管理撤消堆栈?无论如何我每次添加/删除/编辑东西时都不必管理撤消堆栈? – JPC 2011-06-14 17:02:27

+0

它不会阻止您管理撤消堆栈,但它会将撤消堆栈管理大部分移入数据/控制器层,这将显着减少脆弱性。更好的是,您应该能够利用Cocoa中内置的各种控制器,使所有这些变得更加容易和更加灵活(甚至是核心数据 - 我使用核心数据来处理简单的应用程序,因为它几乎消除了所有代码) 。 – bbum 2011-06-14 17:17:58

+0

我的理解是,只有Mac OS支持NSController和绑定之类的东西,并且如果您正在编写遗留的东西/ iOS,那么您没有这些类可以使用。我明白他们是有用的,但如果我不能使用他们,我想知道其他的事情。 – JPC 2011-06-14 17:45:49

1

嗯,这里就是摆脱了警告:

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

铸造到我在清理我想模糊的类。

+0

这不是正确的解决方案;看到我的答案。 – bbum 2011-06-14 16:40:39