مشاكل مع عمل nsbuttoncell
-
22-09-2019 - |
سؤال
لسبب ما ، فإن 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].