سؤال

مرحبًا ، أحاول استخدام 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 خاصية عنصر القائمة لإخبار جزء العناصر بدلاً من العنوان. من المحتمل أن تكون عناوين عنصر القائمة مترجمة ، واستخدام العناوين لتخزين قيم البيانات عرضة للغاية للكسر.

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