Доступ к IBOutlet из другого класса

Эй у меня два UIViewControllers, В первом есть UIButton который содержит изображение. Когда пользователь попадает ко мне вторым ViewControllerЕсть много кнопок, которые содержат разные изображения. Поэтому, когда пользователь нажимает одну кнопку в моем VC2, он должен установить изображение от себя до кнопки UIB на моем VC1.

Я уже реализовал первый ВК, добавив:#import "ViewController1.h" к ViewController2.m до @interface ViewController2 ()

Как я могу это сделать? Например:

VC2:

- (IBAction)seaButton:(id)sender {
//Access the IBOutlet from VC1 and set the image of the Button like:

UIImage * seaBtnImage = [UIImage imageNamed:@"Sea.png"];
[buttonOutlet setImage:seaBtnImage forState:UIControlStateNormal];
}

Спасибо!

2 ответа

Решение

Шаг 1: В ViewController2.h создайте свойство на VC2 для ссылки на VC1:

#import "ViewController1.h"

@property (nonatomic, strong) ViewController1 *viewController1;

Шаг 2: Когда вы создаете VC2 в VC1, установите свойство:

[viewController2 setViewController1:self];

Шаг 3: установите изображение кнопки на ViewController2

[self.buttonVC2 setImage:[self.viewController1.buttonVC1 imageForState:UIControlStateNormal] forState:UIControlStateNormal];

Примечание: лучшая модель - предоставить метод на VC1, который возвращает правильное изображение. Например в VC1:

- (UIImage *)imageForButton {
    return [self.buttonVC1 imageForState:UIControlStateNormal];
}

и в VC2:

[self.buttonVC2 setImage[self.viewController1 imageForButton]];

Вот где вступают делегаты. Определите что-то вроде:

@protocol ButtonSelectionDelegate <NSObject>

- (void)didSelectButtonImage:(UIImage *)image;

@end

и реализовать его в VC1. Добавьте следующее свойство в VC2:

@property (nonatomic, weak) id<ButtonSelectionDelegate> delegate;

и установите VC1 в качестве делегата VC2.

В VC2 IBAction вы будете ссылаться на выше didSelectButtonImage: метод на делегате, передавая локально выбранное изображение:

- (IBAction)seaButton:(id)sender
{
    UIImage *seaBtnImage = [UIImage imageNamed:@"Sea.png"];
    [self.delegate didSelectButtonImage:seaBtnImage];
}

В VC1 didSelectButtonImage: Вы обновите изображение кнопки выхода с помощью VC2, предоставленного делегированием:

- (void)didSelectButtonImage:(UIImage *)image
{
    [self.buttonOutlet setImage:image forState:UIControlStateNormal];
}
Другие вопросы по тегам