iOS——是不是可以强制 UILabel 子类对象成为第一响应者?

Posted

技术标签:

【中文标题】iOS——是不是可以强制 UILabel 子类对象成为第一响应者?【英文标题】:iOS -- is it possible to force a UILabel subclass object to become the first responder?iOS——是否可以强制 UILabel 子类对象成为第一响应者? 【发布时间】:2010-11-03 17:15:35 【问题描述】:

有什么办法吗?

我尝试将以下内容放入子类中:

- (BOOL)canBecomeFirstResponder 

    return YES;

但是当我向对象发送 becomeFirstResponder 消息时,它仍然没有成为第一响应者。

【问题讨论】:

UILabel 成为第一响应者?你希望它回应什么? 它继承自 UIResponder 所以它确实有这个能力。 我正在使用某人的库,当具有某些属性的对象成为第一响应者时,它会做一些事情。它还向第一响应者发送消息。我碰巧想把这一切都和我的标签联系起来。 【参考方案1】:

是的,这是可能的。你应该:

    覆盖becomeFirstResponder 以返回YES

    userInteractionEnabled 设置为YES

    添加UITapGestureRecognizer 来处理水龙头。

    从点击处理程序调用becomeFirstResponder

您甚至可以覆盖inputView 以获得屏幕底部的输入控件。否则什么都没有。

【讨论】:

我应该返回inputView 以在屏幕上看到键盘? @derpoliuk 感谢您的评论。我的错,没有检查 UIKeyboard 类是私有 API。 所以UILabel 成为第一响应者后就没有办法在屏幕上显示键盘了吗?我试图模仿 Viber 或 Telegram 的行为,当键盘在屏幕上并且长按聊天消息时显示 UIMenuController 不确定您的 UILabel 是否应该成为能够显示 UIMenuController 的第一响应者。你确定你负责屏幕键盘的 UITextField 在同一个 UIViewController 中吗? 我打电话给[UILabel becomeFirstResponder]是因为UIMenuController。在这种情况下,UILabel 能够响应来自UIMenuControllercopy: 消息。如果我打电话给[UITextView becomeFirstResonder]UILabel 将无法再回复copy:。感谢您的回复。【参考方案2】:

我没有明确的答案,只有几个(可能是疯狂的)想法:您是否也尝试过覆盖becomeFirstResponder 以返回YES?是否将userInteractionEnabled 也设置为YES

否则,将其设为自定义 UIButton 而不是自定义 UILabel...

【讨论】:

【参考方案3】:

这对我有用。

子类 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];
    

【讨论】:

以上是关于iOS——是不是可以强制 UILabel 子类对象成为第一响应者?的主要内容,如果未能解决你的问题,请参考以下文章

java中的强制类型转换

java中的String类型的对象为啥可以自动转换成Object类型的?而Object却要强制转换成String类型的

java中可以将父类对象强制转换为子类对象吗?直接将父类对象强制转换为子类对象,与将上转型对象强制

iOS - 带约束的多行 UILabel 高度

Java中引用类型的强制类型转换问题

iOS · UILabel加删除线