Спасибо за ваш вопрос, я также буду запускать действие с помощью кнопки в NSTableView. Ваш вопрос помог мне направить меня на правильный путь.
Сначала обратимся к вашему решению, чтобы найти номер строки, на котором находится мой NSTableView. Я смог найти его, не зная кнопки, в своем пользовательском NSTableView я установил следующее в качестве первой попытки:
- (NSInteger)myRowNumber
{
return [(NSTableView*)self.superview.superview rowForView:self];
}
это работает нормально, однако это менее надежно. Это работает только в том случае, если вы уже точно знаете, насколько глубоко вы находитесь в иерархии представлений. Более надежное и универсальное решение:
- (NSInteger)myRowNumber
{
NSTableView* tableView = nil;
NSView* mySuperview = self;
do
{
NSView* nextSuper = mySuperview.superview;
if (nextSuper == nil)
{
NSException *exception =
[NSException exceptionWithName:@"NSTableView not found."
reason:[NSString stringWithFormat:@"%@ search went too deep.",
NSStringFromSelector(_cmd)] userInfo:nil];
@throw exception;
}
if ([nextSuper isKindOfClass:[NSTableView class]])
tableView = (NSTableView*)nextSuper;
else
mySuperview = mySuperview.superview;
} while (tableView == nil);
return [tableView rowForView:self];
}
это работает не только на уровне NSTableView, но и работает со всем, что установлено на любом уровне выше него, независимо от того, насколько сложна иерархия представлений.
Что касается оставшейся без ответа части вашего вопроса, я установил IBOutlet в своем классе и с помощью построителя интерфейса привязал его к владельцу моих файлов (в моем случае к моему классу документов). Получив ссылку на класс, которому я отправлял сообщение, и номер строки, я вызываю функцию. В моем случае вызов требовал, чтобы я передал номер строки, из которой он исходит.
[self.myDoc doSomethingToRow:self.myRowNumber];
Я протестировал это, и оно работает на разных уровнях иерархии представлений выше NSTableView. И он работает без необходимости сначала выбирать строку (что, по-видимому, предполагается в документации Apple).
С уважением, Джордж Лоуренс Сторм, Мальтби, Вашингтон, США
person
George Lawrence Storm
schedule
10.01.2013