iOS - передача имени отправителя (кнопки) в addSubview

У меня главный вид с 3 кнопками. Нажатие на любую из кнопок добавляет SubView.

У кнопок разные названия, и все они связаны с IBAction "switchView".

Код "switchView" приведен ниже.

- (IBAction)switchView:(id)sender{
    secondView *myViewController = [[secondView alloc] initWithNibName:@"secondView" bundle:nil];
    [self.view addSubview:myViewController.view];
}

"SecondView" загружается правильно и все работает нормально.

Проблема в том, что я хочу знать, какая кнопка была отправителем.

Я не хочу создавать 3 подпредставления, по одному для каждой кнопки. Код и XIB будут абсолютно одинаковыми>

Единственное отличие - это переменная, которую я хотел бы настроить во втором представлении (метод viewDidLoad) в зависимости от того, кто является отправителем (какая кнопка была нажата).

Это возможно? Или мне нужно было бы создать 3 subView - по одному для каждой кнопки?

Ваша помощь очень ценится!


person user885483    schedule 24.01.2012    source источник


Ответы (3)


Вы можете идентифицировать различные кнопки с помощью свойства тега. например с вашим методом:

-(IBAction)switchView:(id)sender {
    UIButton *button = (UIButton*)sender;
    if (button.tag == 1) {
        //TODO: Code here...
    } else if (button.tag == 2) {
        //TODO: Code here...
    } else {
        //TODO: Code here...
    }
}

Свойство тега можно установить через InterfaceBuilder. Надеюсь это поможет.

person Markus    schedule 24.01.2012
comment
Спасибо, но, возможно, я неправильно объяснил проблему. Я знаю, как получить отправителя внутри метода switchView. Вопрос после этого. Метод switchView инициирует подпредставление. Это подвид имеет собственные файлы secondView.XIB, secondView.h и secondView.m. Внутри secondView.m ((void) viewDidLoad method) я хочу узнать, какая кнопка инициировала secondView.XIB - person user885483; 25.01.2012
comment
Может, это невозможно. Обойти эту проблему можно было бы, сохранив тег Sender в глобальной переменной внутри метода switchView. (Я мог бы сохранить его как ключ в NSUserDefaults). Затем получите его в подпредставлении secondView. - person user885483; 25.01.2012
comment
Хорошо, понял. Что ж, мой подход состоял бы в том, чтобы вызвать новый контроллер представления в вашем - (IBAction) switchView: (id) sender; и передайте sender.tag как свойство вызова (id) initWith .... например MyViewController * просмотр = [[MyViewController alloc] initWithSenderTag: button.tag]; Однако вам все равно придется сохранить button.tag как глобальную переменную в вашем MyViewController, чтобы проверить его в вашем - (void) viewDidLoad; метод. - person Markus; 26.01.2012

Думаю, можно решить двумя способами:

  1. Создайте свойство, например: @property (nonatomic, strong) IBOutlet UIButton *button1, *button2, *button3;, в вашем контроллере просмотра и свяжите с ними кнопки как выход для ссылки на XIB.
  2. Дайте разные теги каждой кнопке на вашем xib и попросите тег отправителя с UIButton *b=(UIButton*)sender; b.tag;, как подробно опубликовал Маркус.
person Aqua    schedule 24.01.2012

Решение моей проблемы сводилось к передаче данных между mainView и subView.

В моем mainView.h я объявил NSString и его @property

...

NSString *btnPressed;

}
@property(nonatomic, retain) NSString *btnPressed;

...

затем в моем mainView.m внутри метода switchView я сделал следующее:

- (IBAction)switchView:(id)sender{

secondView *myViewController = [[secondView alloc] initWithNibName:@"secondView" bundle:nil];

btnPressed = [NSString stringWithFormat:@"%i", [sender tag]];

[myViewController setBtnPressed:self.btnPressed];

[self.view addSubview:myViewController.view];
}

Эта строка в приведенном выше коде фактически заботится о передаче данных во вновь созданный subView:

[myViewController setBtnPressed:self.btnPressed];

Затем в моем secondView.h я объявляю точно такой же NSString * btnPressed и его @property (хотя это совершенно другой объект, чем тот, что объявлен в main)

Затем в моем secondView.m я получаю значение нажатой кнопки, которая меня интересует.

- (void)viewDidLoad {
[super viewDidLoad];

int theValueOfTheButtonPressed = [self.btnPressed intValue];
}

Это хорошо работает.

Не забудьте @synthesize btnPressed; а также [btnPressed release]; как в mainView.m, так и в secondView.m

person user885483    schedule 26.01.2012