我有三个级别的ViewControllers,可以从整体类别向下钻取到该类别中的主题,再到该主题内的引用。
视图控制器被调用:
1 CategoryViewController
2 SubjectViewController
3 QuoteViewController
数据库表“SUBJECT”包含类别和主题列。
当我在SubjectViewController中时,我可以编辑或删除主题和类别。
我希望能够更新父视图控制器的数据源,CategoryViewController并“刷新”其tableView,所以当我导航回它时,我已经看到所显示的表中反映的更改。
正确的方法是什么?
答案 0 :(得分:1)
使用UIViewControllers
@property(nonatomic, readonly) UIViewController *parentViewController
你可以做那样的事情
CategoryViewController *cvc = (id)self.parentViewController
if ([cvc isKindOfClass:[CategoryViewController class]]) {
// call stuff on cvc, like a table view's -reloadData
}
或者你可以引入一个通知类型并观察它。
答案 1 :(得分:1)
我认为代表团是完成这项任务的最合适的方法。您应该创建一个名为SubjectViewControllerDelegate
的新协议,并添加一些方法,如:
- (void)subjectViewController:(SubjectViewController*)controller didEditSubject:(Subject*)subject;
- (void)subjectViewController:(SubjectViewController*)controller didDeleteSubject:(Subject*)subject;
SubjectViewController有一个委托属性来保持对其委托的弱引用。 每当删除或编辑数据时,它都会调用委托方法。
CategoryViewController实现此协议,并在将其推送到导航控制器之前将其自身设置为SubjectViewController实例的委托。在此方法中,您可以刷新所有表,也可以只更新已更改的行。
<强>更新强>
假设您在CategoryViewController中只有一个部分并将主题保留在NSMutableArray
中,您可以使用类似于下面的代码来更新表格视图的相关部分。
- (void)subjectViewController:(SubjectViewController*)controller didEditSubject:(Subject*)subject{
NSInteger row;
NSIndexPath* indexPath;
NSArray* indexPaths;
row = [self.subjects indexOfObject:subject];
indexPath = [NSIndexPath indexPathForRow:row inSection:0];
indexPaths = [NSArray arrayWithObject:indexPath];
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}
- (void)subjectViewController:(SubjectViewController*)controller didDeleteSubject:(Subject*)subject{
NSInteger row;
NSIndexPath* indexPath;
NSArray* indexPaths;
row = [self.subjects indexOfObject:subject];
indexPath = [NSIndexPath indexPathForRow:row inSection:0];
indexPaths = [NSArray arrayWithObject:indexPath];
[self.subjects removeObjectAtIndex:row];
[self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}
答案 2 :(得分:0)
您可以从活动的ViewController(例如SubjectViewController)发送全局通知,如下所示:
[[NSNotificationCenter defaultCenter] postNotificationName:@"refresh_data" object:nil];
然后在你要刷新的视图控制器中监听它:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataChanged) name:@refresh_data" object:nil];
- (void)dataChanged {
// perform the refreshing
}
答案 3 :(得分:0)