我正在编写Xcode中的应用程序,并想知道是否可以从单独的视图控制器中的按钮调用操作。
例如,如果ViewController1上有一个按钮,并且用户按下按钮,我希望ViewController2上会出现一个图像,即使用户导航回ViewController1然后再返回ViewController2,也会保留该图像。有人可以帮我吗?谢谢。
更新:我在下面的链接中找到了问题的答案......
答案 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}}
请注意,这种在其他对象上设置属性的“键 - 值观察”方法并不是唯一的,或者必然是最好的方法 - 但它有效。