iPhone:如何在父视图控制器和详细信息视图控制器之间来回传递数据

时间:2011-05-07 00:26:55

标签: iphone objective-c

我有一个iphone应用程序,它有一个包含一些数据的父视图控制器。我点击其中一行并将Detail VC推送到堆栈,我想在那里编辑父数据。当我弹出Detail视图时,Parent视图应该会看到更改的数据。

实现这一目标的最简单,最好的方法是什么?我知道我可以:a)上视图控制器链并直接编辑父数据( - 凌乱),b)弹出详细信息视图时使用委托回调( - 繁琐),c)发送通知( - 工作太多) 。

必须有一些更简单的东西,可能使用属性从父视图传递到详细信息视图的完全相同的指针,以便详细视图作用与父母相同的确切数据?这样,详细信息视图在从堆栈弹出时不必执行任何操作。

2 个答案:

答案 0 :(得分:2)

Yup,它叫做模型 - 视图 - 控制器。您确实希望将数据存储到另一个类中,称为模型。应该知道需要了解模型更改的对象的更改,这可以通过键值观察或委派来完成。在这种情况下,您的父视图控制器将订阅模型中的更改。当数据发生更改时,父视图控制器可能会收到通知,并刷新其表。如果父级当前不可见,则可以暂停这些更新并在父级可见时刷新父级。

答案 1 :(得分:0)

在我正在进行的项目中,我创建了一个名为“DataServices”的类。在“applicationDidFinishLaunching”期间,DataServices对象仅实例化一次:

ds = [[DataServices alloc] init];
ds.managedObjectContext = self.managedObjectContext;
[ds initialize_data];

任何需要数据的模块都声明如下:

extern DataServices *ds;

...并且可以根据需要自由访问常用的应用数据。读。写。修改。抽象完成了。我可以做任何我想要的数据的编码,存储和来源,并且需要数据服务的各种模块的接口不会改变。适合我正在做的事情。也许这对你有用。

至于检测从一个类到另一个类的变化。我在DataServices中有一个名为“modified”的标志。例如,在显示可以进行更改的新视图控制器之前清除此标志。 DataServices中的任何“set”或“update”成员函数都将设置此标志。有了这个:

if(ds.modified)
{
// Do what you have to do if data is modified
}

可以根据需要为设置组设置标志,您不一定需要一个“一刀切”的修改标志。旗帜也很复杂。您可以拥有一个仅在特定数据达到阈值时触发的标志等