我有一个应用程序,可以将兴趣点(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]
)
我将非常感谢您如何做到这一点。
答案 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");
}
}