隐藏iOS中的各个键盘按钮

时间:2014-05-30 16:22:38

标签: ios objective-c

目前我正在尝试制作一个Hangman应用。我已经掌握了主要功能,但我想要一种方法来显示用户已经猜到的字母。我想通过隐藏键盘上的这些字母(这是由文本字段激活的标准键盘)来做到这一点。我已经阅读了关于向键​​盘添加按钮的信息(例如本教程:http://www.neoos.ch/blog/37-uikeyboardtypenumberpad-and-the-missing-return-key)到处都是但不能删除/禁用现有按钮。 谁知道解决方案?我似乎无法弄明白。

谢谢

1 个答案:

答案 0 :(得分:4)

没有公共API可以做到这一点。正如评论中已经建议的那样:您应该更好地将自己的键盘实现为UIView子类,并使用方法以您需要的方式更改其行为(隐藏按钮,添加新按钮等)。有很多教程可以教你如何做到这一点。 Apple也建议这样做here。如果您计划将应用程序国际化,还应该在自己的键盘类中处理所有本地化支持。所以这些东西都很难实现。如果您不想这样做,那么唯一的方法是使用一些脏视图操作并将键盘作为UIView对象访问,然后随意使用它。 但是这是一种非常糟糕的方式,因为它使用私有视图层次结构,并且当Apple在iOS 7中使用UITableViewCell视图层次结构进行一些更改时可能会被破坏。这是一种非常有限的方式。首先,您必须确保键盘已经向用户显示,否则您将崩溃(因为windows数组将只包含一个UIWindow)。要执行此操作,只需添加通知观察者:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardShowed)
  name:UIKeyboardDidShowNotification object:nil];

然后在keyboardShowed方法(对于[4.0,7.1]间隔中的iOS版本有效)

-(void)keyboardShowed
 {
UIWindow* window = [[[UIApplication sharedApplication] windows]
                    objectAtIndex:1];
for(UIView* view in window.subviews)
{
    if([[view description] hasPrefix:@"<UIPeripheralHostView"])
    {
        //This view is a keyboard view
        // you can iterate its subviews
        //and make buttons hidden
        NSLog(@"Keyboard Shown: %@", view);
    }
  }
}

然后,当您实际获得对键盘视图的引用时,您应该使用subviews属性跟踪所有层次结构(UIKeyboardImplUIKeyboardLayoutStar等。 )虽然你实际上会获得像按钮这样的视图。

但正如我所说,这是一个糟糕的方式。因为私有视图层次结构很大,有很多子视图。因此,您应该以其他方式处理您的功能。为什么不允许用户输入他已经在游戏中猜到的字母,并向他显示某种警告信息?