1

我想要一些专家的 MVC 设计反馈:

我有一个带有 2 个选项卡的 UITabBarController,每个选项卡都通向一个带有 VC 堆栈的导航控制器。

第一个选项卡路径上的最后一个视图控制器将显示图像。我希望将该图像存储在表格中,并在选择第二个选项卡时随时查看。

如何将此图像从第一个选项卡-> NaVController->last VC (image VC) 发送到第二个选项卡-> NavController->table VC?

我有几个选择:

1- 在 tableVC 中创建一个类方法并让 imageVC 调用该类方法并将该图像直接保存到用户默认值中。这似乎违背了 MVC

2- 在 imageVC 中使用方法和委托属性创建协议,并让表 VC 采用该方法将图像保存在数组中。这里的问题是设置委托的唯一位置是在 ViewDidLoad 中:

[[[[self.tabBarController.viewControllers objectAtIndex:0] viewControllers] objectAtIndex:1] setDelegate:self];

这里的问题是,如果用户从一开始就选择第二个选项卡,应用程序将崩溃,因为很明显 viewControllers 还没有加载到第一个选项卡的导航堆栈上。同样,如果用户先看到 1 张图像,然后选择第二个选项卡,它将执行并设置委托,但不会保存第一个选择的图像。

必须有一个更简单的方法......

在此先感谢 KB

4

3 回答 3

1

我认为您应该将数据模型与视图控制器分开一点。遵循 MVC 方法,模型不应该知道它是如何表示的。因此,对模型进行更改ImageVC不应涉及直接调用任何其他 VC。

我会创建一个单独的实体,例如SelectedImages,并从中添加图像ImageVC,并TableVC在需要显示自身时从中读取。SelectedImages可以是应用程序委托中的属性、Core Data 实体、单例类或类似的东西。

于 2012-07-05T18:52:42.773 回答
0

您可以让 AppDelegate 成为两个 VC 的代表。然后,当第一个选项卡选择图像时,它可以进行某种[self.delegate setTheImage:theImage];调用。第二个选项卡可以调用它的委托(AppDelegate),类似于theImage = [self.delegate getTheImage];. 如果尚未选择图像,则让 AppDelegate 传递 nil 并theImage == nil在显示第二个选项卡之前检查(并可能放置某种界面对象,让用户知道发生了什么)。

下面是一些将 AppDelegate 设置为委托的代码:

AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
self.delegate = appDelegate;

然后你的 AppDelegate 可以有一个像'theImage'这样的图像属性:

-(void) setTheImage:(UIImage *)image:
{
    self.theImage = image;
}

-(UIImage *) getTheImage
{
    if(self.theImage)
        return self.theImage;
    else
        return nil;
}

希望有帮助。

于 2012-07-05T18:52:30.997 回答
0

选项 2 变体:

MainVC 可以采用 ImageVC 协议,并将图像设置为 TableVC。TableVC 必须是 MainVC 属性

于 2012-07-05T19:39:10.477 回答