如何在另一个选项卡的viewcontroller中为协议设置委托?

时间:2012-07-05 18:38:43

标签: ios model-view-controller delegates protocols

我想请一些专家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

3 个答案:

答案 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属性