Методы передачи Objective-C в качестве параметров

Как передать один метод в качестве параметра другому методу? Я делаю это через классы.

Класс A:

+ (void)theBigFunction:(?)func{ // run the func here } 

Класс B:

 - (void)littleBFunction { NSLog(@"classB little function"); } // somewhere else in the class [ClassA theBigFunction:littleBFunction] 

Класс C:

 - (void)littleCFunction { NSLog(@"classC little function"); } // somewhere else in the class [ClassA theBigFunction:littleCFunction] 

Тип, который вы ищете, является селектором ( SEL ), и вы получаете селектор метода следующим образом:

 SEL littleSelector = @selector(littleMethod); 

Если метод принимает параметры, вы просто ставите : куда они идут, вот так:

 SEL littleSelector = @selector(littleMethodWithSomething:andSomethingElse:); 

Кроме того, методы на самом деле не являются функциями, они используются для отправки сообщений определенному классу (при запуске с +) или конкретным экземпляром его (при запуске -). Функции – это C-тип, который действительно не имеет «целевых» методов.

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

 [target performSelector:someSelector]; 

Хорошим примером этого является UIControl UIControl: action: forControlEvents: метод, который вы обычно используете при создании UIButton или некоторых других объектов управления программным UIButton .

Другой вариант – посмотреть на блоки. Он позволяет передавать блок кода (закрытие).

Вот хорошая запись на блоках:

http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1

Вот яблочные документы:

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html

Цель C делает эту операцию относительно легкой. Apple предоставляет эту документацию .

Чтобы напрямую решить свой вопрос, вы не вызываете функцию, а селектор. Вот пример кода:

Большая функция:

 + (void)theBigFunction:(SEL)func fromObject:(id) object{ [object preformSelector:func] } 

Тогда для класса B:

 - (void)littleBFunction { NSLog(@"classB little function"); } // somewhere else in the class [ClassA theBigFunction:@selector(littleBFunction) fromObject:self] 

Тогда для класса C:

 - (void)littleCFunction { NSLog(@"classC little function"); } // somewhere else in the class [ClassA theBigFunction:@selector(littleCFunction) fromObject:self] 

EDIT: Fix selectors sent (удалить точку с запятой)

Вы можете использовать блоки для этой цели. http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html

  • Быстрое нераспознанное селектор отправлено в экземплярную ошибку
  • Передача @selector динамически
  • Есть ли способ распечатать действие SEL?
  • _cmd в языке Swift
  • Нет известного метода класса для селектора 'circleOfButtons: buttonSize: radius:'
  • Правильный способ использования селекторов в Swift
  • Как преобразовать «SEL» и «id» в NSString?
  • Использование NSString для установки цвета для метки
  • Objective C >> Есть ли способ проверить возвращаемое значение Selector?
  • Какова роль селектора в элементе селектора IILocalizedIndexedCollation для объекта: Объект сортировки (id) collationStringSelector: (SEL)
  • Селектор против действия Swift 4
  • Interesting Posts

    iPhone: Показать модальный UITableViewController с панелью навигации

    Цвет заголовка заголовка UITableView

    Ionic 2 fileTransfer.download не реагирует на iOS

    UIActionSheet обрезается своим супервидом, у меня нет панели инструментов или табуляции

    Получение черного экрана при использовании панели вкладок при поиске с помощью SearchController

    iOS: синтаксический анализ Html – как игнорировать теги типа a, li и т. д. внутри <p>

    iOS: я не могу написать файл

    Кокоаподы, находящиеся на «анализе зависимостей»,

    NSAttributedString игнорирует Autoshrink и numberOfLines для UILabel (iOS 6)

    Получить предварительный просмотр камеры в AVCaptureVideoPreviewLayer

    Создание представлений программно Сильные Vs Слабые подзоны в контроллере

    Попытка обернуть платформу поставщика в cocoapod, но компилятор не может найти заголовки

    captureStillImageAsynchronouslyFromConnection: stillImageConnection completeHandler не всегда получает вызов

    UIWebView снижает время загрузки с более эффективным способом

    Как вы получаете доступ к полю userLabel компонентов компоновщика интерфейса в Xcode?

    Давайте будем гением компьютера.