0

抱歉,如果这是初学者的问题。我正在尝试使用部分和自定义单元格格式填充 UITableView。

我在 ViewControl.xib 中创建了一个 customCell,它位于主视图中,如下所示: customCell image

我有一本字典,可以使用另一个类中的方法加载值,具体取决于它所在的行。如果它在第 1 行,则加载第 1 项的详细信息等。

这是我正在使用的代码:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"customCell"];

    // assigns current row's labels
    NSArray * customCellText = [Model cellText:indexPath.row];
    dinnerItem.text = customCellText[0];
    dinnerDescription.text = customCellText[1];
    dinnerTime.text = customCellText[2];

    cell = customCell;
    return cell;
}

这是目前正在生成的:

iPhone模拟器截图

我遇到的问题:

  • 它没有填充所有行,只填充最后一行。
  • 我似乎只能单击填充的行,即使那样它仍然保持选中状态,而不是“单击它”。
  • 如果我快速向上或向下拖动它,它会崩溃。

我认为它与重绘/填充单元格的方式有关?

提前致谢!正弦二

编辑,添加更多代码进行澄清:

视图控制器.m

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return [Model countKeys];
    }

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [Model rowsInSection:section];
    }

    -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
// slightly crap code, this is initiated in viewDidLoad and is an array created by a method in Model.m. Only looks for keys and returns an array.
        return headerKeys[section];
    }

模型.m

+(NSArray *)headerKeys
{
    NSArray *headerKeys = [[NSArray alloc] init];
    headerKeys = [timerDictionary allKeys];
    NSLog(@"All keys: %@", headerKeys);
    return headerKeys;
}

+(NSArray *)customCellText
{
    NSArray *customCellText = [[NSArray alloc]initWithObjects: @"dinnerItemText", @"dinnerDescriptionText", @"01:00", nil];
    return customCellText;
}

+(NSInteger)rowsInSection:(NSInteger)sectionNumber
{
    NSArray *keyContent = [[NSArray alloc] init];
    keyContent = [timerDictionary objectForKey:dictionaryKeys[sectionNumber]];
    NSLog(@"current section[%i]: %i", sectionNumber, [keyContent count]);
    return [keyContent count];
}

+(NSArray *)cellText:(NSInteger)rowNumber
{
    // display all dictionary keys, dictionaryKeys[x] will give back the specific category
    dictionaryKeys = [timerDictionary allKeys];

    // displays contents of first key in dictionary
    NSArray *keyContent = [[NSArray alloc] init];
    keyContent = [timerDictionary objectForKey:dictionaryKeys[0]];

    // creates an array with all items within the selected key
    NSArray *keyItems = [[NSArray alloc] initWithArray:keyContent[rowNumber]];
    return keyItems;
}
4

2 回答 2

0

我可以说以下几点:

如果你只这样做:
UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"customCell"];

在 iOS 5 之前,这并不能保证您可以找回一个单元格。在 iOS5 之前,您必须执行以下操作:

NSString *cellIdentifier = [NSString stringWithFormat:@"I%d-%d", indexPath.section, indexPath.row];

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"customCell"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    // assigns current row's labels
    NSArray * customCellText = [Model cellText:indexPath.row];
    dinnerItem.text = customCellText[0];
    dinnerDescription.text = customCellText[1];
    dinnerTime.text = customCellText[2];

    cell = customCell;
    return cell;
}

如果您使用的是 iOS5/6,则不再需要这些行:

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }

但是必须在 tableView 设置中使用以下方法:

registerClass:forCellReuseIdentifier:  (available in iOS6 and later)
registerNib:forCellReuseIdentifier: (available in iOS5 and later)

只是希望解决您的问题:
不要忘记行 [...](cell == nil)[...]

于 2013-03-04T20:49:35.617 回答
-1

首先,将您的方法更改为此!您需要检查单元格是否为nil

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customCell"];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        // assigns current row's labels
        NSArray * customCellText = [Model cellText:indexPath.row];
        dinnerItem.text = customCellText[0];
        dinnerDescription.text = customCellText[1];
        dinnerTime.text = customCellText[2];

        cell = customCell;
    }


    return cell;
}
于 2013-03-04T20:32:05.933 回答