NSDictionary可以在iPhone上与TableView一起使用吗?

时间:2010-04-17 04:00:50

标签: iphone objective-c uitableview nsdictionary

在UITableViewController子类中,为了加载数据和处理行选择事件,需要实现一些方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1; //there is only one section needed for my table view
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {              
    return [myList count]; //myList is a NSDictionary already populated in viewDidLoad method
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease ];
    }

    // indexPath.row returns an integer index, 
    // but myList uses keys that are not integer, 
    // I don't know how I can retrieve the value and assign it to the cell.textLabel.text


    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // Handle row on select event, 
    // but indexPath.row only returns the index, 
    // not a key of the myList NSDictionary, 
    // this prevents me from knowing which row is selected


}

NSDictionary如何与TableView一起使用?

完成这项工作的最简单方法是什么?

2 个答案:

答案 0 :(得分:23)

我不明白你为什么要为需要回答有序问题(行)的任务使用字典(这是继承无序的),但我认为你已经从某个地方获得了一本字典而无法改变它。 如果是这种情况,则必须定义要显示键的顺序,从而隐式派生数组。一种方法是按字母顺序排列另一种方法如下:

// a) get an array of all the keys in your dictionary
NSArray* allKeys = [myList allKeys];
// b) optionally sort them with a sort descrriptor (not shown)
// c) get to the value at the row index
id value = [myList objectForKey:[allKeys objectAtIndex:indexPath.row]];

value现在是tableView:didSelectRowAtIndexPath:中选择的对象,或者是tableView中进行单元格处理所需的对象:cellForRowAtIndexPath:

如果底层NSDictionary发生了变化,你必须重新加载([myTable reload]或类似的)UITableView。

答案 1 :(得分:3)

是。以下是我们如何做到这一点:

在我们的xml解析器中,我们有这个方法,它将xml加载到一个名为dict:

的字典中
-(NSDictionary *)getNodeDictionary:(Node *)node {
    if (node->level == 0) return xmlData;
    else {
        NSDictionary *dict = xmlData;
        for(int i=0;i<node->level;i++) {
            if ([[dict allKeys] containsObject:SUBNODE_KEY])
                dict = [[dict objectForKey:SUBNODE_KEY]   objectAtIndex:*(node->branches+i)];
        }
        return dict;
    }
}

这个方法

-(NSDictionary *)getDataForNode:(Node *)node {
NSDictionary* dict = [[self getNodeDictionary:node] copy];
return dict;

}

在RadioData类中,我们有一个实例变量:

Node *rootNode;

和一堆方法

-(Node *)getSubNodesForNode:(Node *)node;
-(Node *)getSubNodeForNode:(Node *)node atBranch:(NSInteger)branch;
-(Node *)getParentNodeForNode:(Node *)node;
-(NSInteger)getSubNodeCountForNode:(Node *)node;
-(NSDictionary *)getDataForNode:(Node *)node;

和属性

@property (nonatomic) Node *rootNode;

最后在ViewController中,当我们初始化帧时,我们使用:

radioData = data;
curNode = data.rootNode;

并且在cellForRowAtIndexPath里面我们有:

Node* sub = [radioData getSubNodeForNode:curNode atBranch:indexPath.row];
NSDictionary* dets = [radioData getDataForNode:sub];    

和didSelectRowAtIndexPath:

    Node* node = [radioData getSubNodeForNode:curNode atBranch:indexPath.row];
NSDictionary* data = [radioData getDataForNode:node];

这可能比您想要的更多,但这是大纲。