سؤال

لسبب ما ، فإن nsbuttoncell لعرض الجدول الخاص بي هو اجتياز الكائن الخطأ كمعلمة. أحاول قراءة علامة nsbuttoncell بعد النقر عليها.

فيما يلي نسخة مبسطة من الكود الخاص بي:

- (int)numberOfRowsInTableView:(NSTableView *)aTableView {
    return 3;
}

- (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex {
    [aCell setTitle:@"Hello"];
    [aCell setTag:100];
}

- (void)buttonClick:(id)sender {
    NSLog(@"THE TAG %d",[sender tag]);
    NSLog(@"THE TITLE: %@",[sender title]);
}

- (void)refreshColumns {
    for (int c = 0; c < 2; c++) {
        NSTableColumn *column = [[theTable tableColumns] objectAtIndex:(c)];

        NSButtonCell* cell = [[NSButtonCell alloc] init];
        [cell setBezelStyle:NSSmallSquareBezelStyle];
        [cell setLineBreakMode:NSLineBreakByTruncatingTail];
        [cell setTarget:self];
        [cell setAction:@selector(buttonClick:)];
        [column setDataCell:cell];
    }
}

- (void)awakeFromNib {
    [self refreshColumns];
}

يقول إعادة الإعادة من وحدة التحكم:

    THE TAG:   0
    -[NSTableView title]: unrecognized selector sent to instance 0x100132480

للوهلة الأولى (بالنسبة لي على الأقل) ، يجب أن يقول هذا أن العلامة 100 ، لكنها لا. أيضًا (كما يمكن رؤيته من إخراج وحدة التحكم الثانية) ، يبدو أن المعلمة التي يتم إرسالها إلى محدد "ButtonClick" غير صحيحة ، وأعتقد أنه يجب أن يتلقى nsbuttoncell ، لكنه يتلقى NstableView.

هل كانت مفيدة؟

المحلول

يبدو أن المرسل هو عرض الجدول الخاص بك ولكن ليس خلية عرض الجدول المحددة.

ليس لدي أي فكرة عن كيفية السماح لخلية الجدول بأن تصبح المرسل ، ولكن يمكنك معرفة الخلية التي يتم النقر عليها من خلال البحث عن فهرس الصف والعمود الذي تم النقر عليه ، وبعد ذلك يمكنك القيام بما يجب أن يحدث بعد النقر فوق الخلية.

- (void)buttonClick:(id)sender {
    NSEvent *event = [NSApp currentEvent];
    NSPoint pointInTable = [tableView convertPoint:[event locationInWindow] fromView:nil];
    NSUInteger row = [tableView rowAtPoint:pointInTable];
    NSTableColumn *column = [[tableView tableColumns] objectAtIndex:[tableView columnAtPoint:pointInTable]];
    NSLog(@"row:%d column:%@", row, [column description]);
}

نصائح أخرى

في هذه الحالة ، يكون المرسل بالفعل nstableView ولكن يمكنك استرداد الصف وعمود عنصر التحكم الذي أثار الحدث بالفعل ببساطة مع [Sender ClickedRow] و [Sender ClickedColumn].

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top