Правильный (App Store Safe) способ уйти в отставку первого респондента? - PullRequest
3 голосов
/ 27 января 2010

Как правильно подать в отставку текущий первый ответчик?

Я видел следующее: Цикл по полям и вызов resignFirstResponder для каждого.

[[self textFieldForRow:0] resignFirstResponder];
[[self textFieldForRow:1] resignFirstResponder];
[[self textFieldForRow:2] resignFirstResponder];
[[self textFieldForRow:3] resignFirstResponder];

И это похоже на вызов частной функции, безопасен ли этот магазин приложений?:

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
UIView   *firstResponder = [keyWindow performSelector:@selector(firstResponder)];   
[firstResponder resignFirstResponder];      

Есть ли лучший способ?

Спасибо!

Комментарии: Похоже, что второй метод использует закрытый API и чье-то приложение было отклонено из-за этого: ссылка

Ответы [ 4 ]

13 голосов
/ 23 марта 2010
3 голосов
/ 04 февраля 2010

Посмотрите на этот вопрос: Как [законно] получить текущий первый респондент на экране на iPhone?

Мой ответ на этот вопрос должен отлично работать в вашей ситуации.

0 голосов
/ 03 февраля 2010

Мое предложение будет заключаться в том, чтобы реализовать хакерскую и медленную версию firstResponder самостоятельно в категории, а затем подать радар с просьбой добавить метод. Что-то вроде этого:

- (id)my_FirstResponder
    for view in [self subviews]
        if [self isFirstResponder]
            return self
        return [self my_firstResponder]
    return nil

Использование performSelector: для вызова метода, отсутствующего в публичных заголовках, определенно является основанием для отклонения, поэтому не делайте этого. Да, и не забудьте использовать префикс (как это делает приведенный выше код) при добавлении категории, чтобы избежать конфликтов.

0 голосов
/ 27 января 2010

Код, который у вас там, не вызывает никакой частной функции. Что происходит, это:

 //Gets the application window
 UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
 //Gets the first Responder View for the window
UIView   *firstResponder = [keyWindow performSelector:@selector(firstResponder)];  
//Make the UView resign the first responder 
[firstResponder resignFirstResponder];     

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

Кроме того, есть ли лучший способ сделать что именно? Если вы говорите о получении UIView, который является первым ответчиком для keyWindow, вы можете сделать это при создании uiview:

myView.tag = 100;

и получить его:

UIView *firstResponder = [self viewWithTag:100];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...