可以从单独的视图控制器调用操作吗?

时间:2014-08-12 16:08:43

标签: ios objective-c viewcontroller

我正在编写Xcode中的应用程序,并想知道是否可以从单独的视图控制器中的按钮调用操作。

例如,如果ViewController1上有一个按钮,并且用户按下按钮,我希望ViewController2上会出现一个图像,即使用户导航回ViewController1然后再返回ViewController2,也会保留该图像。有人可以帮我吗?谢谢。

更新:我在下面的链接中找到了问题的答案......

if my "button" is selected on view controller 1, then image should then display and stay on view controller 2

2 个答案:

答案 0 :(得分:2)

是的,有可能。如果在ViewController 1中声明ViewController2的实例,那么您可以从ViewController1始终完全控制ViewController2中的内容。例如,在.m中,有

@implementation ViewController1
@synthesize viewController2

- (void) viewDidLoad
{
    viewController2 = [[UIViewControllerClass alloc] init];
}

在.h中,有

@interface ViewController1
@property (nonatomic, strong) UIViewControllerClass *viewController2;

这将确保ARC在您完成之前不会废弃您的第二个ViewController,在这种情况下,当您终止程序时。

然后,您可以像调用任何其他类一样从ViewController1调用属于ViewController2的方法。

[viewController2 doSomethingWithThisData: stringData];

答案 1 :(得分:0)

尚未提及的一些注意事项......

取决于您在viewControllers&在设置共享数据(图像等)的地方,VC2有一个选项可以使用公共@property来设置图像。

VC2.h 

@IBOutlet (nonatomic, weak) UIImageView *imageFromVC1;

VC1应导入VC2标头,以便创建&保存VC2的实例并设置图像。 您需要在VC1中跟踪VC2的状态,作为VC1的@property。

    VC1.m 
     #import VC2.h 

     @interface VC1()
        @property (nonatomic, strong) VC2 *viewController2;
     @end 

     @implementation
     ...

请注意,需要进入.h for VC1 - 除非其他类需要了解它,这应该是.m&类的扩展名中的私有属性。未暴露在标题中。您不再需要使用@synthesize - 如果您使用的是XCode 4.4或更高版本,则会自动使用-viewDidLoad

此时的问题是VC2在需要之前不应该存在(这会浪费有限的内存)。您可以在VC1中的-(void)someMethodToShowVC2OrStoryboardPrepareForSegue { if (self.viewController2 == nil) { self.viewController2 = [[VC2 alloc] init]; } //handle transition & set up VC2. } 中立即创建它,但它只是坐在那里吸收资源。

更好的选项是'lazy instantiation',你只能在转换为第一次显示VC2时创建一个VC2实例。此时还要在VC1中设置@property。

if ([self.viewController2 respondsToSelector:@selector(setImageFromVC1)])
{
UIImage *myImage = [UIImage imageNamed:@"myImageName"];
[self.viewController2 setImageFromVC1:myImage];
} 

您也可以要求VC2确保它具有允许您设置图像的公共方法。如果没有,它会崩溃。写作&显然您应该知道该方法存在 - 这只是一种防御性做法,可以直接将信息发送到VC2:

self.viewController2.imageFromVC1 = myImage;

此处“setImageFromVC1”是使用@property时自动生成的setter方法的名称。如果您使用其他名称,请更改此项。 替代方法是使用点表示法:{{1}}

请注意,这种在其他对象上设置属性的“键 - 值观察”方法并不是唯一的,或者必然是最好的方法 - 但它有效。