Как работает forwardingTargetForSelector:?

У меня есть UIBarButtonItem, Когда он получает сообщение, которое он не может обработать, я хочу, чтобы он отправил это сообщение определенному контроллеру представления.

Я думал, что смогу сделать это с помощью элемента панели кнопок forwardingTargetForSelector: метод, но, видимо, такое свойство не найдено на объектах типа UIBarButtonItem, (Пункт терминологии: означает ли это forwardingTargetForSelector: такое частная собственность? edit: Подождите, я думаю, что я в замешательстве... методы с двоеточием в конце не являются свойствами... так что вы можете когда-нибудь сделать метод (например, getter/setter), какие параметры передаются?)

И значит ли это, что для того, чтобы установить значение forwardingTargetForSelector: Я должен сделать это из файла.m объекта, для которого я хочу установить его? Что означало бы, что я должен был бы создать подкласс моего UIBarButtonItem?

И если да, то почему это не является публичной собственностью NSObjects?

И, кроме того, каков наилучший способ достижения моей цели перенаправления, предпочтительно избегая подклассов?

Дополнительная информация:

Все это проистекает из моей склонности использовать одно действие в ответ на различные нажатия одной и той же кнопки. Действие в настоящее время содержится в моем делегате (см. Как мне реализовать [почти] идентичные действия, используемые в различных VC? (Ответ: использовать категорию)) и отличается только тем, что оно должно отправлять сообщение presentViewController контроллеру представления, который создал экземпляр кнопка, которая отправила действие. Таким образом, в действии я могу отправить сообщение presentViewController sender, который является экземпляром кнопки, и я хочу иметь возможность пересылать это сообщение контроллеру представления, который создал этот экземпляр кнопки, что я могу сделать, если я установлю свойство перенаправления каждой кнопки сразу после того, как оно будет создано в его соответствующем просмотр контроллера.

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

1 ответ

Решение

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

Это не может быть собственность в @propertyсмысл объявленного свойства, потому что каждый селектор может иметь различную цель; за этим должно быть отображение. Это просто не так, как работают объявленные свойства.

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

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

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

Я не уверен, какую именно проблему вы пытаетесь решить ("создание кнопки пересылки сообщений, на которые она не отвечает", все еще носит довольно общий характер - в частности, почему это необходимо?), Поэтому трудно быть более точный.

Другие вопросы по тегам