باستخدام nspopupbuttoncell مع nstableview
-
28-09-2019 - |
سؤال
مرحبًا ، أحاول استخدام nspopupbuttoncell داخل nstableView. بشكل أساسي عند تحديد عنصر في المنبثقة ، أريد عرضه في عمود/صف عرض الجدول. عند الضغط على عنصر في الخلية المنبثقة ، أقوم بتخزينه داخل مصدر البيانات باستخدام "TableView: SetObject: FortableColumn: Row" ، ثم عندما يطلب الجدول البيانات التي أتراجعها وتعيين حالة الخلية المنبثقة في "TableView: ObjectValueversableColreclumn: صف:". يرجى العثور على الرمز المرفق الخاص بي. أنا عالق تمامًا الآن. آمل أن يتمكن شخص ما من فهمه. شكرا لكم مقدما.
هذا داخل وحدة التحكم:
//Create the table columns
NSTableColumn *nameColumn = [[NSTableColumn alloc] initWithIdentifier:LXDetailItemName];
NSTableColumn *dataTypeColumn = [[NSTableColumn alloc] initWithIdentifier:LXDetailItemDataType];
NSTableColumn *deviceColumn = [[NSTableColumn alloc] initWithIdentifier:LXDetailItemDevice];
//Data type column drop down
NSPopUpButtonCell *dataTypeDropDownCell = [[NSPopUpButtonCell alloc] initTextCell:@"" pullsDown:YES];
[dataTypeDropDownCell setBordered:NO];
[dataTypeDropDownCell setEditable:YES];
NSArray *dataTypeNames = [NSArray arrayWithObjects:@"NULL", @"String", @"Money", @"Date", @"Int", nil];
[dataTypeDropDownCell addItemsWithTitles:dataTypeNames];
[dataTypeColumn setDataCell:dataTypeDropDownCell];
//Add the columns to the table
[tableView addTableColumn:nameColumn];
[tableView addTableColumn:dataTypeColumn];
[tableView addTableColumn:deviceColumn];
enter code here
هذا هو داخل فئة DataSource/Depatate.
enter code here
@implementation LXTestDataSource
- (id)init
{
self = [super init];
if (self)
{
tableContents = [[NSMutableArray alloc] init];
//Setup test data
NSMutableArray *keys = [NSMutableArray arrayWithObjects:LXDetailItemName, LXDetailItemDataType, LXDetailItemDevice, nil];
NSMutableArray *objects = [NSMutableArray arrayWithObjects:@"one", @"NULL", @"NULL", nil];
for (int i = 0; i < 4; i++)
{
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithObjects:objects forKeys:keys];
[tableContents addObject:dictionary];
[dictionary release];
}
}
return self;
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
return [tableContents count];
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
if ([[aTableColumn identifier] isEqualToString:LXDetailItemDataType])
{
NSMutableDictionary *rowDictionary = [tableContents objectAtIndex:rowIndex];
NSString *title = [rowDictionary objectForKey:LXDetailItemDataType];
NSLog(@"objectValueForTableColumn: %@", title); //DEBUG
return [NSNumber numberWithInt:[[aTableColumn dataCell] indexOfItemWithTitle:title]];
}
else if ([[aTableColumn identifier] isEqualToString:LXDetailItemDevice])
{
NSMutableDictionary *rowDictionary = [tableContents objectAtIndex:rowIndex];
NSString *title = [rowDictionary objectForKey:LXDetailItemDevice];
NSLog(@"objectValueForTableColumn: %@", title); //DEBUG
return [NSNumber numberWithInt:[[aTableColumn dataCell] indexOfItemWithTitle:title]];
}
else
{
NSMutableDictionary *rowDictionary = [tableContents objectAtIndex:rowIndex];
return [rowDictionary objectForKey:[aTableColumn identifier]];
}
}
- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
if ([[aTableColumn identifier] isEqualToString:LXDetailItemDataType])
{
NSMenuItem *menuItem = [[aTableColumn dataCell] itemAtIndex:[anObject integerValue]];
NSMutableDictionary *rowDictionary = [tableContents objectAtIndex:rowIndex];
NSLog(@"%@", [menuItem title]); //DEBUG
//Update the object value at the column index
[rowDictionary setObject:[menuItem title] forKey:LXDetailItemDataType];
}
else if ([[aTableColumn identifier] isEqualToString:LXDetailItemDevice])
{
NSMenuItem *menuItem = [[aTableColumn dataCell] itemAtIndex:[anObject integerValue]];
NSMutableDictionary *rowDictionary = [tableContents objectAtIndex:rowIndex];
NSLog(@"%@", [menuItem title]); //DEBUG
//Update the object value at the column index
[rowDictionary setObject:[menuItem title] forKey:LXDetailItemDevice];
}
else
{
//Get the row
NSMutableDictionary *rowDictionary = [tableContents objectAtIndex:rowIndex];
//Update the object value at the column index
[rowDictionary setObject:anObject forKey:[aTableColumn identifier]];
}
}
@end
المحلول
أعتقد أنني اكتشفت ذلك. أستخدم الطريقة "Settitle:" من الخلية المنبثقة لتحديث نص الخلية بعد النقر فوق عنصر القائمة. فيما يلي طريقة مندوب عرض الجدول التي استخدمتها.
- (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
if ([[aTableColumn identifier] isEqualToString:LXDetailItemDataType])
{
NSMutableDictionary *rowDictionary = [tableContents objectAtIndex:rowIndex];
NSString *title = [rowDictionary objectForKey:LXDetailItemDataType];
[aCell setTitle:title];
}
else if ([[aTableColumn identifier] isEqualToString:LXDetailItemDevice])
{
NSMutableDictionary *rowDictionary = [tableContents objectAtIndex:rowIndex];
NSString *title = [rowDictionary objectForKey:LXDetailItemDevice];
[aCell setTitle:title];
}
}
نصائح أخرى
أعتقد أن كل ما يجب عليك القيام به بعد تعيين القيمة في tableView:setObjectValue:forTableColumn:row:
هو الاتصال reloadData
في عرض الجدول لإجباره على تحديث نفسه بالتغييرات التي أجريتها على نموذج البيانات. يستخدم NSPOPUPBUTTONCELL فهرس العنصر كقيمة كائنه ، بحيث يجب أن يعمل جزء من الأشياء بشكل صحيح بدون هذا الرمز في طريقة WillDisplayCell Depegate.
جانبا ، أوصي باستخدام representedObject
خاصية عنصر القائمة لإخبار جزء العناصر بدلاً من العنوان. من المحتمل أن تكون عناوين عنصر القائمة مترجمة ، واستخدام العناوين لتخزين قيم البيانات عرضة للغاية للكسر.