2010-08-15 18 views
6

हैलो मैं एक एनएसपीओपी व्यू के अंदर एक एनएसपीओपअप बटन का उपयोग करने की कोशिश कर रहा हूं। असल में जब आप पॉप अप में कोई आइटम चुनते हैं तो मैं इसे तालिका दृश्य कॉलम/पंक्ति में प्रदर्शित करना चाहता हूं। जब पॉपअप सेल में कोई आइटम दबाया जाता है, तो मैं इसे "tableView: setObject: forTableColumn: row" का उपयोग करके डेटा स्रोत के अंदर संग्रहीत करता हूं, फिर जब तालिका डेटा अनुरोध करती है तो मैं पुनर्प्राप्त करता हूं और पॉपअप सेल की स्थिति को "tableView: objectValueForTableColumn में सेट करता हूं: पंक्ति: "। कृपया मेरा कोड संलग्न करें। मैं अभी पूरी तरह से अटक गया हूँ। मुझे उम्मीद है कि कोई इसका एहसास कर सकता है। अग्रिम धन्यवाद।एनएसपीओपअपब्यूटनसेल का उपयोग एनएसटीबल व्यू

इस नियंत्रक के अंदर है:

//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 

यह डेटा स्रोत/प्रतिनिधि वर्ग के अंदर है।

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 
+0

// सेटअप परीक्षण डाटा \ N NSDictionary * शब्दकोश = @ {LXDetailItemName: @ "एक", LXDetailItemDataType: @ "शून्य" LXDetailItemDevice: @ "शून्य"}; \ n (आई इंट = 0; मैं <4; i ++) {\ n [tableContents addObject: dictionary]; \ n } \ n – geowar

उत्तर

3

मुझे लगता है कि मैंने इसे समझ लिया है। मैं मेन्यू आइटम क्लिक करने के बाद सेल के पाठ को अद्यतन करने के लिए पॉप अप सेल के "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]; 
    } 
} 
+0

मुझे समझ में नहीं आता है कि उपर्युक्त कोड काम करता है तो मुझे पॉपअप सेल के लिए कुछ भी क्यों वापस करना होगा डेटासोर्स विधि में "tableView: objectValueForTableColumn: पंक्ति:"। मैं इस विधि में पॉपअप सेल के लिए कुछ भी वापस नहीं कर सकता और यह अभी भी काम करेगा। कोई टिप्पणी? – David

+0

मैं स्विफ्ट 3 का उपयोग करके 6 साल बाद इस मुद्दे पर भाग गया। ऐसा लगता है कि 'ऑब्जेक्ट के अंदर' एनएसपीओपबटनटन 'पर मेनू आइटम सेट करना है। तालिका: तालिका कॉलम जारी नहीं है, लेकिन इसे' WillDisplayCell' में डालने पर काम करता है। आश्चर्यजनक रूप से पर्याप्त, टेक्स्ट फ़ील्ड्स और चेकबॉक्स ** ** ** 'डिस्प्लेप्लेसेल' के बिना ठीक काम करते हैं। –

2

मुझे लगता है कि तुम सब tableView:setObjectValue:forTableColumn:row: में मूल्य निर्धारित करने के बाद क्या करने की जरूरत चाहिए तालिका दृश्य पर reloadData कॉल करने के लिए परिवर्तन आप डेटा मॉडल में किए गए साथ ही अद्यतन करने के लिए यह मजबूर करने के लिए है। NSPopUpButtonCell आइटम ऑब्जेक्ट का उपयोग अपने ऑब्जेक्ट वैल्यू के रूप में करता है, ताकि चीजों का हिस्सा इच्छानुसार डिस्प्लेसेलसेल प्रतिनिधि विधि में उस कोड के बिना सही ढंग से काम करना चाहिए।

एक तरफ के रूप में, मैं शीर्षक आइटम के बजाय आइटम भाग को बताने के लिए मेनू आइटम की representedObject संपत्ति का उपयोग करने की अनुशंसा करता हूं। मेनू आइटम शीर्षक संभावित रूप से स्थानीयकृत हो सकते हैं, और डेटा मानों को संग्रहीत करने के लिए शीर्षक का उपयोग ब्रेकेज के लिए बहुत ही संवेदनशील है।

+0

मैंने आपके द्वारा उल्लेखित ऑब्जेक्ट वैल्यू को सेट करने के बाद पुनः लोडडेटा को कॉल करने का प्रयास किया और NSPopUpButtonCell स्वयं अपडेट नहीं होता है। प्रतिनिधित्व ऑब्जेक्ट के बारे में यह एक अच्छा मुद्दा है, मैं इसका उपयोग करूंगा। धन्यवाद। – David

संबंधित मुद्दे