我在为MainViewController
中的按钮设置图像时遇到了一个小问题,来自另一个UIViewController
。
实际上会发生这样的事情:当我点击lockButton
中的MainViewController
时,会打开一个不同的UIViewController
,我可以设置密码。成功设置密码后,我需要更改lockButton
中MainViewController
的图片。
任何人都可以帮我解决这个问题吗?谢谢。
答案 0 :(得分:0)
您必须指向MainViewController
的实例,然后更改其内部组件的设置。
首先,您应该能够从您的应用程序委托访问该实例,如果您使用Xcode中的默认项目模板,至少这是很简单的。为此,您应该使用以下代码段:
MyAppDelegate *app = [[UIApplication sharedApplication] delegate];
MainViewController *view = delegate.mainViewController;
要确保此功能正常,请检查MainViewController
的实例是否可用作app delegate的头文件中的属性。你应该找到这样的东西:
@property(readonly) MainViewController *mainViewController;
此外,MainViewController
必须通过其头文件将您要查找的按钮公开为属性。如果你是通过IB设计视图,你应该有这样的东西,我想:
@property(nonatomic, retain) IBOutlet UIButton *lockButton;
一旦掌握了所有这些东西,您就可以通过这种方式更改按钮的图像:
MyAppDelegate *app = [[UIApplication sharedApplication] delegate];
MainViewController *view = delegate.mainViewController;
UIImage *image = [UIImage imageNamed:@"image.png"];
[view.lockButton setImage:btnImage forState:UIControlStateNormal];
这应该适合你。你可能不得不在这里或那里调整一些东西,但这是你应该实现解决方案的方式。
此解决方案可以正常工作,但它不是唯一的解决方案。一种不同的方法可能是使用协议。你要做的是创建一种方法,使控制器将密码对话保存回主视图控制器。
您的PasswordViewController
(让我们以这种方式调用新的视图控制器)应该在头文件中定义一个新协议。例如
@protocol PasswordViewControllerDelegate
@required
- (void) passwordChanged;
@end
然后,您的MainViewController
必须实现此委托:
@interface MainViewController : UIViewController <PasswordViewControllerDelegate>
....
@end
@implementation MainViewController
....
- (void) passwordChanged {
[lockButton setImage:[UIImage imageNamed:@"myImage.png" forState:UIControlStateNormal];
}
....
}
现在,在PasswordViewController
的定义中,您必须定义一个名为delegate
的属性:
@property (nonatomic, retain) id<PasswordViewControllerDelegate> delegate;
当您从PasswordViewController
创建MainViewController
的新实例时,您应将MainViewController
设置为其代理:
PasswordViewController pvc = [[PasswordViewController alloc] init];
pvc.delegate = self;
// then you present the view controller
当你更改PasswordViewController
中的密码时,你只需要调用委托的方法。这很容易:
[self.delegate passwordChanged];