2010-03-09 48 views
9

我是一个.NET程序员,新的客观C.UIPickerView与NSDictionary

我想做一个UIPickerView行为像一个.NET dropdownlist。用户看到文本列表并选择一个,并在代码中使用所选值(即ID)。

我一直在浏览将近半天的时间,试图找出答案。我可以添加一个带有字符串列表的常规PickerView,具有多个组件的picker视图和具有依赖组件的picker视图,其中任何一个都不会回答我的查询。

请帮忙。

+0

的UIPickerView是不会看起来或行为完全像.net下拉列表,但必要的功能在那里。除了外观,你有什么特殊的问题吗? – DyingCactus 2010-03-09 03:54:36

+0

我只想为UIPickerView的数据源使用键值对。看起来这是不可能的。 我有一个自定义NSObject [带名称和ID属性]。我将名称设置为在UIPickerView上显示。当用户选择一个名称时,我需要找到名称的ID并使用它。 感谢您的回复。 – Dave 2010-03-09 18:04:13

回答

13

您可以使用NSDictionary作为UIPickerView的数据源,但是如果您有一个已经包含键/值对的自定义NSObject,那么使用这些对象的NSArray作为数据源会更简单。

假定自定义对象是Planet属性planetId(int)和planetName(NSString)。创建一个名为planets的NSArray,其中的对象按照您希望它们出现在选取器中的顺序创建(它们不必按planetId顺序排列)。

在titleForRow,你会怎么做:

return ((Planet *)[planets objectAtIndex:row]).planetName; 

在didSelectRow,让所选择的星球:

Planet *selectedPlanet = (Planet *)[planets objectAtIndex:row]; 

//
//
有了一个NSDictionary,你必须将键值映射到选取器的行号。一种方法是将关键值设置为行号并将自定义对象添加为值。

所以词典将这样创建:

NSArray *keys = [NSArray arrayWithObjects:@"0", @"1", @"2", @"3", nil]; 
NSArray *values = [NSArray arrayWithObjects:mercury, venus, earth, mars, nil]; 
items = [[NSDictionary dictionaryWithObjects:values forKeys:keys] retain]; 

在titleForRow,你会怎么做:

NSString *itemKey = [NSString stringWithFormat:@"%d", row]; 
Planet *planet = (Planet *)[items objectForKey:itemKey]; 
return planet.planetName; 

在didSelectRow,你会怎么做:

NSString *itemKey = [NSString stringWithFormat:@"%d", row]; 
Planet *selectedPlanet = (Planet *)[items objectForKey:itemKey]; 
+0

工作!谢谢 – Dave 2010-03-10 17:31:47

+1

正是我在寻找,谢谢@DyingCactus! – 2014-01-01 20:09:30

+1

我可以在Swift中得到这个代码吗 – 2014-12-18 13:58:45