代码之家  ›  专栏  ›  技术社区  ›  Peter DeWeese

获取UIView类型

  •  4
  • Peter DeWeese  · 技术社区  · 14 年前

    我一直看到在UIView中手动遍历特定类型的所有子视图的示例。例如,如果希望在键盘外单击以关闭键盘,而不管哪个字段处于活动状态,则可以:

    -(IBAction)backgroundClick:(id)sender
    {
        [myTextField resignFirstResponder];
        [myOtherTextField resignFirstResponder];
        // ... repeat for each of my zillion text fields.
    }
    

    for(UIView *v in self.view.subviews)
        if(v.hasKeyboard) // or something like java's instanceof
            [v resignFirstResponder];
    

    虽然对键盘的特定情况的改进(比如现在发现哪个是第一反应者)是值得赞赏的,但我对一般情况更感兴趣。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Gubb    14 年前

    你不能做点像

    if([v isMemberOfClass:[UITextField class]]){
    [v resignFirstResponder];
    }

    ?

        2
  •  2
  •   Peter    14 年前

    if( [v respondsToSelector:@selector(isFirstResponder)] && [v isFirstResponder])
    {
      [v resignFirstResponder];
      break;
    }
    

    这种方式只会在当前第一响应者上调用resignFirstResponder,并在找到当前第一响应者时停止。它将用于UITextFields、uitextview等以及任何未来的文本编辑视图(假设它们继续实现responder方法)。

    对于更一般的情况,您可以使用

    if( [v isKindOfClass:UITextField.class] )
    {
      [v resignFirstResponder];
    }
    

    对于通用键盘,首选第一种,因为您只对键盘感兴趣。对象声称它将处理消息(方法调用),因此实际上不必关心它是什么类型。如果您真的需要确定它是UITextField,则首选第二个选项。