自定义数据驱动的TableView

时间:2009-11-17 15:28:23

标签: iphone uitableview tableview cocoa-design-patterns

我有一个分组的tableview,在一个部分中填充了XML数据。我想要做的是在数据驱动之前创建另一个部分,并对其应用一个动作。

示例:

向用户显示一个“使用您当前位置”的按钮(手动创建的部分),下方是用户可以选择的国家列表(数据驱动部分)

使用设置菜单作为指南。有些选项在一个部分中是单行,因此它们看起来像是一个按钮......

如果这没有意义,我会尝试更好地解释它。


所以我有两个明显的代码行......很简单

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}    
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return [countrysData count];
    }

我想要的是让numberOfSectionsInTableView返回2并让第一个“部分”说“点击使用你当前的位置”然后推进查看地图,第二部分显示列表我目前在工作的国家。

3 个答案:

答案 0 :(得分:1)

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if(section == 0){
        return 1;
    }else{
        return [countrysData count];
    }
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2;
}   

然后你应该选择在didSelectRowAtIndexPath:方法中做什么,因为indexPath.section。哦,你应该检查你的cellForRowAtIndexPath:方法中的indexPath.section。

答案 1 :(得分:1)

您只需要更新UITableViewDataSource和UITableViewDelegate协议的所有实现,以适当地考虑新部分及其行。

例如,以下是更新numberOfSectionsInTableView:tableView:numberOfRowsInSection:tableView:cellForRowAtIndexPath:的方法,但您还需要至少更新tableView:didSelectRowAtIndexPath:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // calculate the number of sections of non-data (might just be 1)    
    // calculate the number of sections for the data (you were already doing this, might just be 1)
    // return the sum
    return 1 + 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSInteger rowCount = 0;
    switch (section) {
    case 0:
        // non-data section has 1 row/cell
        rowCount = 1;
        break;
    case 1:
        // data section uses an array
        rowCount = [dataArray count];
        break;
    }
    return rowCount;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *nonDataCellID = @"NonDataCell";
    static NSString *dataCellID = @"DataCell";
    UITableViewCell *cell;

    int section = [indexPath indexAtPosition:0];
    int row = [indexPath indexAtPosition:1];

    switch (section) {
        case 0:
            // or you can just use standard cells here
            cell = [tableView dequeueReusableCellWithIdentifier:nonDataCellID];
            if (cell == nil) {
                [[NSBundle mainBundle] loadNibNamed:@"NonDataCell" owner:self options:NULL];
                cell = nonDataCell; // nonDataCell is an IBOutlet to this custom cell
            }

            // configure non-data cell here (use tags)
            UILabel *someLabel = (UILabel*)[cell viewWithTag:1];
            someLabel.text = @"Non-data cell";
            break;

        case 1:
            // or you can just use standard cells here
            cell = [tableView dequeueReusableCellWithIdentifier:dataCellID];
            if (cell == nil) {
                [[NSBundle mainBundle] loadNibNamed:@"dataCell" owner:self options:NULL];
                cell = dataCell; // dataCell is an IBOutlet to this custom cell
            }

            // configure data call here (using "row")
            UILabel *someDataLabel = (UILabel*)[cell viewWithTag:1];
            someDataLabel.text = [[dataArray objectAtIndex:row] valueForKey:@"name"];
            break;
       }

    return cell;
}

答案 2 :(得分:0)

我很确定你可以动态改变UITableViewDataSource方法'numberOfSectionsInTableView:'的返回。一旦用户选择了附加部分,只需设置一个标志,让该方法返回所需的表数。然后你强制重新加载表,你应该看到新的部分。