Параметр отправителя

У меня есть метод, который принимает отправителя и вызывается с помощью кнопки UI. Как мне получить этот объект для приведения в UIImageView? В основном, как мне повторно использовать код для кнопки.

- (IBAction)startClick:(id)sender { 
    button.animationImages = [NSArray arrayWithObjects:
                                       [UIImage imageNamed:@"Pic_1.png"],
                                       [UIImage imageNamed:@"Pic_2.png"],
                                       [UIImage imageNamed:@"Pic_3.png"],
                                       nil];
    [button setAnimationRepeatCount:1];
    button.animationDuration = 1;
    [button startAnimating];
}
 Brad Larson♦07 июл. 2009 г., 02:33
Это дубликат вашего предыдущего вопроса:stackoverflow.com/questions/1088481/sender-tag

Ответы на вопрос(4)

Решение Вопроса

UIButton а такжеUIImageView являются различными подклассамиUIView (а такжеUIButton это подклассUIControl) поэтому единственное, что у них общегоUIView методы. Еслиsender действительноUIButton, рассматривая это какUIImageView может привести к ошибкам, таким как «нераспознанный селектор, отправленный экземпляру»; и тому подобное.

В целом, более чистым решением является создание отдельного метода, который является действием дляUIImageView, (В отличие от Java, Objective-C и Cocoa предпочитают не вводить код ответа пользовательского интерфейса в один метод, основанный на типе события & # x2014; скорее, вы организуете код логически на основе операции, которая должна произойти.)

Если вам необходимо вызвать этот метод как для кнопок, так и для изображений, вы можете отделить логику следующим образом:

- (IBAction) startClick:(id)sender {
  if ([sender isKindOfClass:UIButton]) {
    ...
  }
  else if ([sender isKindOfClass:UIImageView]) {
    ...
  }
}
 02 мая 2012 г., 19:39
если бы я мог использовать - (IBAction), я не мог бы опубликовать здесь :), но проблема в том, что эта кнопка находится в другом классе, я не могу сделать для нее IBAction в этом классе
 27 февр. 2014 г., 09:39
Это должно быть & quot; if ([sender isKindOfClass: [UIButton class]]) {...} & quot ;. С квадратными скобками и «класс» включен.

чтобы получить метку кнопки и определить, какая из них была нажата:

NSLog (@ & quot; нажатая кнопка:% @ & quot;, [[отправитель titleLabel] текст]);

Надеюсь, это поможет.

Суреш

ментом пользовательского интерфейса, который будет отправлять -startClick :? Если так, то напишите метод действия следующим образом:

- (IBAction)startClick:(id)sender { 
    NSParameterAssert(sender == self.startClickButton);
    if (sender == self.startClickButton) {
        UIButton *button = self.startClickButton;
        [...]
    }
}

Если у вас нет выхода / свойства кнопки, вы можете проверить класс отправителя и при необходимости выполнить приведение.

- (IBAction)startClick:(id)sender { 
    NSParameterAssert([sender isKindOfClass: [UIButton class]]);
    if ([sender isKindOfClass: [UIButton class]]) {
        UIButton *button = (UIButton *)sender;
        [...]
    }
}

Наконец, допустимо (во время компиляции) отправлять любое сообщение со значением типа id. (Вы получите исключение во время выполнения, если получатель не отвечает на это сообщение.) Однако вы не можете использовать точечный синтаксис.

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

[button setAnimationImages: [NSArray ...]];
[button setAnimationDuration: 1];

Это важно понимать - точечный синтаксис эквивалентен синтаксису отправки сообщений - он не мистический.

UIButton *button = (UIButton*) id;
// then do all you button code here.

Это должно работать. В противном случае было бы лучше изменить функцию на

 (IBAction)startClick:(UIButton *)theButton

Таким образом, вы хотите бросить кнопку.

 07 июл. 2009 г., 02:58
Последнее предложение, вероятно, не сработает. Методы действия IB всегда имеют тип возврата «IBAction» (который определяется как void), а параметр имеет тип id.

Ваш ответ на вопрос