Как я могу изменить изображение кнопки в контроллере с другого? - PullRequest
1 голос
/ 09 июня 2011

У меня небольшая проблема при настройке изображения для кнопки в MainViewController, от другого UIViewController.

На самом деле происходит следующее: когда я нажимаю lockButton в MainViewController, он открывает другой UIViewController, где я могу установить пароль. Как только пароль успешно установлен, мне нужно изменить изображение lockButton в MainViewController.

Может кто-нибудь помочь мне выбраться из этой проблемы? Спасибо.

1 Ответ

0 голосов
/ 09 июня 2011

Вы должны указать на экземпляр MainViewController и затем изменить настройки для его внутренних компонентов. Прежде всего, вы должны иметь возможность доступа к этому экземпляру из вашего делегата приложения, по крайней мере, это просто, если вы используете шаблон проекта по умолчанию из XCode. Для этого вы должны использовать этот фрагмент:

MyAppDelegate *app = [[UIApplication sharedApplication] delegate];
MainViewController *view = delegate.mainViewController;

Чтобы убедиться, что это работает, проверьте, доступен ли экземпляр MainViewController как свойство в заголовочном файле делегата приложения. Вы должны найти что-то вроде этого:

@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];
...