如何在控制器中更改另一个按钮的图像?

时间:2011-06-09 07:44:55

标签: iphone cocoa uiviewcontroller uibutton

我在为MainViewController中的按钮设置图像时遇到了一个小问题,来自另一个UIViewController

实际上会发生这样的事情:当我点击lockButton中的MainViewController时,会打开一个不同的UIViewController,我可以设置密码。成功设置密码后,我需要更改lockButtonMainViewController的图片。

任何人都可以帮我解决这个问题吗?谢谢。

1 个答案:

答案 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];