1

我有一个基本上是 8000 个用户名列表的 plist。我将它加载到一个 NSDictionary 中,然后是一个排序键数组(因为我得到它时列表没有排序),然后循环加载到一个 NSComboBox 中。

这可行,但可能需要几秒钟来填充组合框。

这是我的代码:

// in my .h
IBOutlet NSComboBox *comboUserList; // which is connected to a combo box in my .xib

// in my .m

// userInfoPlist is an NSString path to the file
NSDictionary *userList = [NSDictionary dictionaryWithContentsOfFile:userInfoPlist];

// sort user info into an array

NSArray* sortedKeys = [userList keysSortedByValueUsingSelector:@selector(caseInsensitiveCompare:)];

// then populate the combo box from userList in the order specified by sortedKeys

for ( NSString *usersKey in sortedKeys) {
    [comboUserList addItemWithObjectValue:[userList objectForKey:usersKey]];
}

所以这是可行的,但是对于 8000 个奇怪的条目,填充组合框需要一些明显的时间(在 2011 年的 MACBook Air 上只需一两秒,但仍然很明显)。有没有更快的方法来使用 NSDictionary 或 NSArray 作为数据源,而不是在 for 循环中执行?

4

3 回答 3

1

用户外部数据源。

[mEmailListBox setUsesDataSource:YES];
[mEmailListBox setDataSource:self];  
/*
If you use setDataSource: before setUsesDataSource:, setDataSource: throws an exception.
*/
- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox;
{
    return [DatSource count];//DatSource NSArray
}
- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index;
{
    return DatSource[index];
}  

看看组合框编程主题

您还可以借助noteNumberOfItemsChangedreloadData方法在后台加载数据

于 2013-08-12T08:55:50.667 回答
0

如果您在对键进行排序并将值放入 NSComboBox 时不需要像此代码这样的行为,您可以采用不同的方式。

如果可以放置排序的键或值,则可以使用一次调用而不是循环:

[comboUserList addItemsWithObjectValues:sortedKeys];
于 2013-10-21T18:01:39.527 回答
0

您应该使用数据源而不是直接提供值。使用-[NSComboBox setUsesDataSource:]and-[NSComboBox setDataSource:]设置您的数据源,然后NSComboBoxDataSource在您的控制器上实现协议。

请参阅: https ://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Protocols/NSComboBoxDataSource_Protocol/Reference/Reference.html#//apple_ref/occ/intf/NSComboBoxDataSource

于 2013-08-12T06:15:09.750 回答