2011-06-14 64 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