我想请一些专家MVC设计反馈:
我有一个带有2个选项卡的UITabBarController,每个选项卡都指向带有一堆VC的Nav控制器。
第一个选项卡路径上的最后一个视图控制器将显示图像。我希望该图像存储在一个表格中,并在选择第二个标签时随时查看。
如何从第一个标签发送此图片 - > NaVController->最后一个VC(图像VC)到第二个标签 - > NavController->表VC?
我有几个选择:
1-在tableVC中创建一个类方法,让imageVC调用该类方法,并将该图像直接传递给用户默认值。这似乎违背了MVC
2-使用方法和委托属性在imageVC中创建协议,并使表VC采用该方法将图像保存在数组中。这里的问题是设置委托的唯一地方是ViewDidLoad:
[[[[self.tabBarController.viewControllers objectAtIndex:0] viewControllers] objectAtIndex:1] setDelegate:self];
问题在于,如果用户从头开始选择第二个选项卡,则应用程序将崩溃,因为很明显,viewControllers尚未加载到第一个选项卡的导航堆栈上。同样,如果用户首先看到1个图像然后选择第二个选项卡,它将执行并设置委托但不保存第一个选定的图像。
必须有一种更简单的方式.....
提前致谢 KB
答案 0 :(得分:1)
我认为您应该将您的数据模型与视图控制器分开一点。遵循MVC方法,模型不应该知道它的表示方式。因此,在ImageVC
中对模型进行更改不应涉及对任何其他VC的直接调用。
我会创建一个单独的实体,例如SelectedImages
,并将ImageVC
中的图片添加到其中,并在需要显示自己时TableVC
读取它。 SelectedImages
可以是app委托中的属性,Core Data实体,单例类或类似内容。
答案 1 :(得分:0)
您可以将AppDelegate作为两个VC的委托。然后当第一个标签选择图像时,它可以进行某种[self.delegate setTheImage:theImage];
调用。第二个选项卡可以调用其委托(AppDelegate),类似于theImage = [self.delegate getTheImage];
。如果尚未选择图像,则在显示第二个选项卡之前让AppDelegate传递nil并检查theImage == nil
(并且可能会设置某种界面对象,让用户知道发生了什么)。
以下是一些用于将AppDelegate设置为Delegate的代码:
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;
}
希望有所帮助。
答案 2 :(得分:0)
选项2变体:
MainVC可以采用ImageVC协议并将图像设置为TableVC。 TableVC必须是MainVC属性