2016-04-05 3 views
0

Я столкнулся с простой проблемой, но пока не нашел оптимального решения. У меня есть представление, основанное на NSTableView, которое загружает его представления ячеек из разных xib. Мое табличное представление динамическое и основано на пользовательском вводе. Я буду динамически добавлять и удалять строки, в конечном счете настраивая источник данных таблицы. У каждого из моих NSTableCellViews есть кнопка в нем, и я связываю обработчик кликов IBAction с NSView, который содержит представление таблицы. То, что мне нужно сделать, это получить номер строки для кнопки, которая была нажата в представлении таблицы, чтобы я мог обработать логику. Я в состоянии сделать это успешно: tableViewSelectionDidChange:(NSNotification *)notificationNSTableViewCell selectedRow number для IBAction click

Вот как я это делаю:

- (void)tableViewSelectionDidChange:(NSNotification *)notification { 
    NSTableView *tableView = [notification object]; 
    NSInteger selectedRow = [tableView selectedRow]; 
} 

Это отлично работает для пользователя фактически щелкнув строку. Теперь, когда я двигаю NSButton IBAction и связать его в NSView следующим образом:

- (IBAction)buttonClickHandler:(NSButton *)sender { 
    NSInteger selectedRow = [self.tblView rowForView:sender]; 
    NSLog(@"%ld", (long)selectedRow); 
} 

я на основе этого подхода от this выбранного ответа.

Я также попытался это:

- (IBAction)buttonClickHandler:(NSButton *)sender { 

    id representedObject = [(NSTableCellView *)[sender superview] objectValue]; 
    NSLog(@"%@", representedObject); 
} 

//My configuration 

- (void)configureView { 

    [self.view setFrame:[self bounds]]; 
    [self addSubview:self.view]; 

    [self.view setWantsLayer:YES]; 

    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    self.tblView.delegate = self; 
    self.tblView.dataSource = self; 





    [self.tblView setIntercellSpacing:NSMakeSize(0, 0)]; 

    [self.tblView registerNib: [[NSNib alloc] initWithNibNamed:@"ParentCellXib" bundle:nil] forIdentifier:@"ParentCell"]; 
    [self.tblView registerNib: [[NSNib alloc] initWithNibNamed:@"ChildCellXib" bundle:nil] forIdentifier:@"ChildCell"]; 
    [self.tblView registerNib: [[NSNib alloc] initWithNibNamed:@"HeaderCellXib" bundle:nil] forIdentifier:@"HeaderCell"]; 
} 

Но изображаемый объект возвращает нуль. Если это стоит упомянуть, я установил владельца файла в качестве представления, содержащего tableView, поэтому я могу связать IBAction, и я подклассифицировал TableCellView в другой класс. Тем не менее, я не думаю, что это часть проблемы, насколько я могу судить. Есть ли простое решение, чтобы надежно дать мне выбранное число Row на основе нажатия кнопки в этой ячейке? Оба подхода, которые я попытался выше, возвращают -1 и null соответственно.

+1

Итак, где и что не работает? Вы говорите, что работает, но не говорите, что не работает. – rocky

+0

Я обновил сообщение, чтобы уточнить, в чем проблема. – zic10

+0

'rowForView' должен работать. Является ли 'self.tblView' правильным и является' sender' под-представлением 'self.tblView'? Является ли NSView делегатом 'self.tblView'? Объекты внутри представлений таблицы, основанные на представлении, могут быть связаны только с делегатом таблицы. – Willeke

ответ

-1

Я бы установить строку в свойстве тега NSButton в:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    SomeTableCellView *cell = [tableView makeViewWithIdentifier:@"cell" owner:self]; 
    if (cell == nil) { 
     cell = // init some table cell view 
     cell.identifier = @"cell"; 
    } 

    cell.button.tag = row; 
    [cell.button setTarget:self]; 
    [cell.button setAction:@selector(buttonAction:)]; 
} 

- (IBAction)buttonAction:(id)sender { 
    NSLog(@"row: %d", sender.tag); 
} 
+0

Похоже, что кто-то спустился вниз и не сказал почему. – rocky

-1

Try This

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    yourCustomeCell *aCell; 
    NSString *aStrIdentifier = @"yourIdentiFier"; 
    aCell = (yourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:aStrIdentifier]; 

    //you have to set your indexpath 
    objc_setAssociatedObject(aCell.btnUpload_or_Add, @"objBtn", indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    [aCell.YourButton addTarget:self action:@selector(yourButtonActiontapped:) forControlEvents:UIControlEventTouchUpInside]; 

    return aCell; 
} 

-(IBAction)yourButtonActiontapped:(UIButton *)sender{ 

    NSIndexPath *aIndPath = objc_getAssociatedObject(sender, @"objBtn"); 
    NSLog(@"row:%@",aIndPath.row); 
} 

также вы должны импортировать #import <objc/runtime.h>

другой способ, чтобы получить строку в IBAction - TAG, но objc - лучший вариант TAG.

-1

Создайте подкласс UIButton и добавьте свойство для NSIndexPath для кнопки. Используйте эту кнопку в методе cellForRowAtIndexPath. назначьте путь указателя к ячейке указателю пути указателя.

On Tap, получить указательный путь от его отправителя. В вашем случае указательный путь этой кнопки.

Смежные вопросы