Для продолжения того, что уже было сказано, один из подходов, обычно используемых в подобных проблемах, состоит в том, чтобы ItemViewController
(родительский) делегат CategorySelectionViewController
(дочерний), а когда tableView:didSelectRowAtIndexPath:
срабатывает в CategorySelectionViewController
, отправьте сообщение обратному вызову делегата в ItemAddViewController
- передав выбранную категорию в качестве параметра.
Эту концепцию можно реализовать следующим образом:
@protocol CategorySelectionViewControllerDelegate;
// in CategorySelectionViewController.h
@interface CategorySelectionViewController : UITableViewController {
id<CategorySelectionViewControllerDelegate> delegate;
}
@property (nonatomic, assign) id<CategorySelectionViewControllerDelegate> delegate;
@end
@protocol CategorySelectionViewControllerDelegate
// delegate callback skeleton
-(void)userDidSelectCategory:(Category *)categorySelected;
@end
// in CategorySelectionViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *currentCategory = category;
if (currentCategory != nil) {
NSInteger index = [categories indexOfObject:currentCategory];
NSIndexPath *selectionIndexPath = [NSIndexPath indexPathForRow:index inSection:0];
UITableViewCell *checkedCell = [tableView cellForRowAtIndexPath:selectionIndexPath];
checkedCell.accessoryType = UITableViewCellAccessoryNone;
}
//set the checkmark accessory
[[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark];
// here's where you message the delegate callback
[self.delegate userDidSelectCategory:[categories objectAtIndex:indexPath.row]];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
Скелет ItemAddViewController будет затем изменен для соответствия протоколу CategorySelectionViewControllerDelegate
:
// in ItemAddViewController.h
@protocol CategorySelectionViewControllerDelegate;
@interface ItemAddViewController : UITableViewController <CategorySelectionViewControllerDelegate>
{ /* etc.... */ }
@property (nonatomic, retain) Category *category;
// delegate callback
-(void)userDidSelectCategory:(Category *)categorySelected
// in ItemAddViewController.m
// set the CategorySelectionViewController delegate as this ItemViewController when you instantiate it
-(void)showCategorySelectionViewController {
CategorySelectionViewController *myChild = [[CategorySelectionViewController alloc] init];
myChild.delegate = self;
[self presentModalViewController:myChild animated:YES];
}
// implement the delegate callback
-(void)userDidSelectCateogry:(Category *)categorySelected {
self.category = categorySelected;
// other handling code as needed...
}
Что касается выполнения этого путем вызова [self parentViewController]
в CategorySelectionViewController
, уловка в том, что ItemAddViewController
наследуется от UITableView
, поэтому, когда вы отправляете сообщение [self parentViewController]
, компилятор думает, что вы говорите с UITableView
, а не ItemAddViewController
, если вы не разыгрываете его явно. Следовательно, он не знает, что self.parentViewController
имеет свойство, называемое category
. Вы можете исправить это, добавив приведение типа:
ItemAddViewController *itemAddViewControllerParent = (ItemAddViewController *)[self parentViewController];
itemAddViewControllerParent.category = [categories objectAtIndex:indexPath.row];
Надеюсь, это поможет.