@selector ключевое слово в программировании iPhone - PullRequest
1 голос
/ 03 марта 2010

- (Недействительными) displayNameBy: (NSString *) название {

    mylable.text = name;

}

Я хочу вызвать этот метод, используя ключевые слова @selector.

например:

[MyButton addTarget:self action:***@selector(displayNameBy:name)*** forControlEvents:UIControlEventTouchUpInside];

Здесь жирным курсивом я сомневаюсь ... могу ли я передать имя параметра отсюда когда я пытаюсь передать значение имени, я получаю ошибку.

любой способ получить значение имени в методе displayNameBy: name. используя ключевые слова @selector.

здесь MyButton я создал программно. не в интерфейсе конструктора.

спасибо и всего наилучшего

Ответы [ 3 ]

4 голосов
/ 03 марта 2010

Есть промежуточный метод.как:

{
   ...
   [MyButton addTarget:self action:@selector(displayName) forControlEvents:UIControlEventTouchUpInside];
   ...
}

-(void) displayName
{
   [self performSelector:@selector(displayNameBy:) withObject:@"name"];
}

-(void)displayNameBy:(NSString*)name{

    mylable.text = name;

}
2 голосов
/ 03 марта 2010

Если вы создаете селектор с одним аргументом для своего действия (как вы делаете в displayNameBy:), аргумент является отправителем действия. В этом случае ваш экземпляр кнопки.

Согласно документации UIControl существует три различных типа поддерживаемых селекторов:

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event

Где вы ожидаете, что name будет определен? Это зависит от действий пользователя, состояния приложения или чего-то еще? В зависимости от того, какой метод используется, вы можете создать подкласс UIButton, который включает в себя либо необходимую логику, либо объявить протокол делегата, установить делегат в вашем контроллере представления и заставить реализацию делегата установить метку кнопки. Последнее, вероятно, лучше с точки зрения MVC, если только источник name не является ослепительно простым (т. Е. Атрибут, который можно установить на кнопке, а не то, что кнопка должна будет вычислять на основе другого состояния приложения). *

1 голос
/ 03 марта 2010

Селектор метода - просто displayNameBy:. name в конце - это имя параметра. Однако я не знаю, откуда вы ожидаете этот параметр NSString *name. Аргументом для метода действия является отправитель, который в этом случае будет кнопкой. Так было бы - (void)displayNameBy:(id)sender.

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

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

[myButton setTarget:[BlockProxy proxyWithBlock:^{ [self displayNameBy:name]; }] action:@selector(call:)  forControlEvents:UIControlEventTouchUpInside]; 

Это самое близкое, я думаю. Потому что вы действительно хотите, чтобы кнопка вызывала замыкание, что дает вам PLBlocks. Стоит ли того, чтобы получить такую ​​выразительность, вы звоните.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...