2010-11-03 2 views
5

Есть ли способ сделать это?iOS - можно ли заставить объект подкласса UILabel стать первым ответчиком?

Я попытался положить следующее в подкласс:

- (BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 

Но когда я послал объект сообщение becomeFirstResponder, он еще не стал первым ответчиком.

+0

UILabel становится первым ответчиком? Что вы хотите, чтобы он ответил? – kennytm

+3

Он наследуется от UIResponder, поэтому у него есть возможность. – Ben

+0

Я использую чью-то библиотеку, которая делает вещи, когда объект с определенными свойствами становится первым ответчиком. Он также отправляет сообщения первому ответчику. Мне захочется связать все это с моим лейблом. –

ответ

0

У меня нет определенного ответа, только несколько (может быть, сумасшедшие) идеи: вы также пытались переопределить becomeFirstResponder, чтобы вернуть YES? Имеет ли он userInteractionEnabled также установленный на YES?

В противном случае, сделать его на заказ UIButton вместо пользовательских UILabel ...

1

Да, это возможно. Вы должны:

  1. Override becomeFirstResponder вернуть YES.

  2. userInteractionEnabled до YES.

  3. Добавить UITapGestureRecognizer для обработки кранов.

  4. Звоните becomeFirstResponder с крана.

Вы даже можете переопределить inputView, чтобы получить входной контроль в нижней части экрана. Иначе ничего не будет.

+0

Что я должен вернуть в 'inputView', чтобы увидеть клавиатуру на экране? – derpoliuk

+0

@derpoliuk благодарит за комментарий. Моя ошибка, не проверял, что класс UIKeyboard является частным API. –

+0

Итак, нет способа получить клавиатуру на экране после того, как 'UILabel' станет первым ответчиком? Я пытаюсь имитировать поведение Viber или Telegram, когда клавиатура находится на экране и долгое нажатие на сообщение чата показывает 'UIMenuController'. – derpoliuk

0

Это сработало для меня.

Подкласс UILabel и переопределить эти методы:

- (BOOL)canBecomeFirstResponder { 
     return YES; 
    } 

    - (BOOL)canPerformAction:(SEL)action 
        withSender:(id)sender 
    { 
     return (action == @selector(copy:)); 
    } 

    - (void)copy:(id)sender { 
     [[UIPasteboard generalPasteboard] setString:self.text]; 
    } 

Добавить Жест в ярлык для обнаружения крана.

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(LongPressDetected:)]; 
[_messageLabel addGestureRecognizer:longPress]; 

ручки жест событие, представляют собой UIMenuController с желаемой рамой:

- (void)LongPressDetected:(UILongPressGestureRecognizer*)gesture { 

     [_messageLabel becomeFirstResponder]; 
     [[UIMenuController sharedMenuController] setTargetRect:_messageLabel.bounds inView:_messageLabel]; 
     [[UIMenuController sharedMenuController] setMenuVisible:YES animated:NO]; 
    }