2014-01-20 4 views
1

В чем разница между объявляя UIButton в Xcode, как это:В чем разница: (id) отправителя?

- (IBAction)testButton; 

и объявления кнопки, как это:

- (IBAction)testButton:(id)sender; 

Я понимаю, что в файле .m вы затем воплотят кнопки соответственно , как показано ниже:

- (IBAction)testButton 
{ 
// insert code here.. 
} 

и настройки его следующим образом:

Есть ли дополнительные вещи, которые вы можете сделать, объявив кнопку с: (id) отправителем, есть ли какая-то дополнительная стабильность, или нет никакой разницы?

+6

И не забывайте, что третий вариант: '- (IBAction) testButton: (id) отправитель forEvent: (UIEvent *) event'. – rmaddy

+0

См. Документы для 'UIControl addTarget: действие: forControlEvents:'. – rmaddy

+0

Это два разных метода; тот, который не принимает аргументов, и тот, который принимает один аргумент. То, что структура рассматривает их как один и тот же метод, представляет собой деталь реализации. – bbum

ответ

3

С помощью: (id) отправителя вы можете получить доступ к самой кнопке через переменную отправителя. Это удобно во многих ситуациях. Например, у вас может быть много кнопок и каждый тег. Затем используйте метод [sender tag], чтобы найти, какая кнопка была нажата, если многие кнопки используют этот IBAction.

0

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

- (IBAction)flipCard:(id)sender { 
    [self.game flipCardAtIndex:[self.cardButtons indexOfObject:sender]]; 
    self.flipCount++; 
    [self updateUI]; 
} 

Этот метод используется для карточной игры. На экране есть несколько кнопок, представляющих разные карты. Когда вы нажимаете кнопку, карта в модели должна быть перевернута. Мы знаем, какой из них, находя индекс переменной sender

+0

Это будет 'id', а не' UIButton'. – nhgrif

+2

@nhgrif Любой идентификатор или UIButton в порядке. id - общий тип для всех объектов, UIButton - более конкретный. Иерархия, мой друг :) –

+0

Я понимаю, но 'IB' дает вам' id', и в этом случае лучше использовать 'id'. – nhgrif

1
- (IBAction)someMethod:(id)sender { 
    // do stuff 
} 

Использование (id)sender, у вас есть ссылка на который послал вызов метода. Обратите внимание, что это не должно быть ограничено UIButton.

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

#pragma unused (sender) 

(компилятор может лучше оптимизировать свой код, если вы сделаете это.)

Однако, нет ничего плохого подключения нескольких элементов пользовательского интерфейса к тому же IBAction метода. Вы можете отличить отправителя через:

[sender tag] 

... который возвращает int, который был либо установить с помощью раскадровки или программно.

Кроме того, этот способ можно вызвать в другом месте вашего класса. Вы можете либо передать nil в качестве отправителя, либо вы можете передать ему определенный элемент пользовательского интерфейса, чтобы закрепить его в результатах, которые вы закодировали для объектов этого тега.

Тем не менее, если вы планируете вызвать метод с nil аргументом, вы всегда можете бросить:

if(!sender) 

...в метод для обработки специальной логики, когда метод был вызван программным способом, а не через взаимодействие с пользователем.

+0

Насколько я знаю #pragma unused не влияет на скомпилированный код, только отключает неиспользуемые предупреждения переменных, которые в этом случае не требуется. Мне будет интересна ссылка на дополнительную информацию о неиспользованном генерации кода #pragma. – Conor

+0

@Dearden http://nshipster.com/__attribute__/ «Знание этого небольшого контекста позволяет компилятору соответственно оптимизировать». (Ctrl + F "unused") Я не знаю подробностей об этом, но я, как правило, доверяю вещи из 'NSHipster'. – nhgrif

+0

Благодарим вас за ссылку на NSHipster. Я был заинтригован раньше, но тестирование не показало разницы в языке ассемблера, отметив переменные как неиспользуемые. Я считаю, что LLVM достаточно умен, чтобы не требовать указателя, по крайней мере, под ARC. – Conor

Смежные вопросы