创建静态"添加"动态UITableView单元格的索引0处的单元格

时间:2015-04-10 15:38:51

标签: ios objective-c uitableview core-data

我有一个应用程序,可以将兴趣点(POI)添加到managedObjectContext。在AddPOITableViewController上,我有一个转到CategoryTableViewController的segue,CategoryTVC显示managedObjectContext中的现有类别。

导航如下:

POIList-->AddPOIViewController-->CategoryTableViewController-->AddCategoryVC

问题: 由于我在managedObjectContext中没有任何类别,因此CategoryTVC上没有显示任何类别。

我想做什么:CategoryTVC上创建一个特殊单元格,该单元格将转换为AddCategoryTVC,我可以在managedObjectContext中创建新类别。

我知道我需要在index[0]处添加一个特殊的单元格,然后点击它。我想把我的category.count计算在内。我会使用numberOfRowsInSection(例如category.count+1)为我的特殊单元格添加额外空间。对于segue到AddCategoryVC,我必须以不同的方式对待我的“添加类别”单元格(我将其设为index[0]

我将非常感谢您如何做到这一点。

2 个答案:

答案 0 :(得分:0)

didSelectRowAtIndexPath回调中的indexPath对象会告诉您单击了哪个单元格。只需检查此对象,就可以看到它是"添加类别"单元格,如果是,则执行另一个segue。像这样:

- (void)tableView:(UITableView *)tableview didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.row == <myAddRowIndex>)
    {
         [self performSegueWithIdentifier:@"AddCategorySegue" sender:self];
    }
    else
    {
         [self performSegueWithIdentifier:@"pointOfInterestSegue" sender:self];
    }
}

答案 1 :(得分:0)

我发现这篇文章对完成任务很有帮助:

Combine static and prototype content in a table view

在这种情况下,我实际上是在indexPath.row [0]创建一个静态单元格,其余的内容是动态的,并从managedObjectContext中提取。

这是我最终做的事情:

// Added this constant
#define NUMBER_OF_STATIC_CELLS 1

// Added these properties
static NSString *DynamicIdentifier = @"DynamicIdentifier";
static NSString *StaticIdentifier = @"StaticIdentifier";

// Tweaked numberOfRowsInSection to add an extra cell
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return self.locationCategories.count + NUMBER_OF_STATIC_CELLS;
}

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

    if (indexPath.row < NUMBER_OF_STATIC_CELLS) {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:StaticIdentifier];

        // this sets up the static cell at the top
        if (cell == nil) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:StaticIdentifier];
        }

        cell.textLabel.text = @"Add Category";
        cell.textLabel.textColor = [UIColor redColor];
        return cell;

    } else {

        // this sets up the dynamic cells below
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:DynamicIdentifier forIndexPath:indexPath];
        // Configure the cell...
        NSManagedObject *locationCategory = [self.locationCategories objectAtIndex:indexPath.row];
        cell.textLabel.text = [locationCategory valueForKey:@"categoryName"];

        if (locationCategory == self.category.categoryName) {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else {
            cell.accessoryType = UITableViewCellAccessoryNone;
        }
        return cell;
    }
}

这是segue发生在AddCategoryViewController

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

    // If there was a previous selection, unset the accessory view for its cell.
    NSManagedObject *currentCategory = self.category.categoryName;

    if (currentCategory != nil && indexPath.row > NUMBER_OF_STATIC_CELLS - 1) {
        NSInteger index = [self.locationCategories indexOfObject:currentCategory];
        NSIndexPath *selectionIndexPath = [NSIndexPath indexPathForRow:index inSection:0];
        UITableViewCell *checkedCell = [tableView cellForRowAtIndexPath:selectionIndexPath];
        checkedCell.accessoryType = UITableViewCellAccessoryNone;
    }

    if (indexPath.row > NUMBER_OF_STATIC_CELLS - 1) {
        // Set the checkmark accessory for the selected row.
        [[tableView cellForRowAtIndexPath:indexPath]setAccessoryType:UITableViewCellAccessoryCheckmark];

        // Update the type of the location category instance
        self.category.categoryName = [self.locationCategories objectAtIndex:indexPath.row];

        // Deselect row
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    } else {
        [self performSegueWithIdentifier:@"addCategory" sender:nil];
        NSLog(@"addCategory segue fired from didSelectRowAtIndexPath method");
    }
}