更新父视图控制器的数据源

时间:2012-02-03 21:17:02

标签: iphone objective-c ios tableview

我有三个级别的ViewControllers,可以从整体类别向下钻取到该类别中的主题,再到该主题内的引用。

视图控制器被调用:

1   CategoryViewController
2   SubjectViewController
3   QuoteViewController

数据库表“SUBJECT”包含类别和主题列。

当我在SubjectViewController中时,我可以编辑或删除主题和类别。

我希望能够更新父视图控制器的数据源,CategoryViewController并“刷新”其tableView,所以当我导航回它时,我已经看到所显示的表中反映的更改。

正确的方法是什么?

4 个答案:

答案 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)

检查this link是否有类似的问题,如果您需要更多详细信息,请阅读this link