【问题标题】:Creating a new keyboard button for iPhone - Bug in InputAccessoryView and InputView为 iPhone 创建新的键盘按钮 - InputAccessoryView 和 InputView 中的错误
【发布时间】:2012-01-18 19:38:42
【问题描述】:

我在我的程序中创建了一个 2 UITextView。他们必须这样做:

  • TextView1 - 将有一个新的 InputView
  • TextView2 - 将是一个带有新按钮的普通数字键盘

因为 iPhone 的数字键盘在零的左边有一个空按钮。所以,我可以放一个 UIView 来模拟一个新的键盘。所以,我用一个 UIToolbar 和这个按钮创建了一个 UIView,并在 TextView 中设置了一个简单的

[textView setInputAccessoryView:myView];    

在这个视图中捕捉点击有点复杂。我必须在 main.m 中继承 principalClassName

int retVal = UIApplicationMain(argc, argv, MyPrincialClass ,MyDelegateClass);

然后用

创建这个类
@interface MyPrincialClass : UIApplication
- (void)sendEvent:(UIEvent *)anEvent;
@end
@implementation MyPrincialClass
- (void)sendEvent:(UIEvent *)event {
    [super sendEvent:event];
    NSSet *touches = [event allTouches];
    UITouch *touch = touches.anyObject;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"click" object:(id)touch];
}
@end

现在只听这个通知并检查这个点击是否在正确的区域。

因为我有一个 UINavegationBar,我必须去“下一个”和“上一个”TextView。好的,这只是运行

[textView1 resignFirstResponder];
[textView2 becomeFirstResponder];

如果所有 textView 具有相同的 inputView(键盘)而不是按钮正常工作。但是...因为其中一个 textView 有另一个 inputView,所以我的问题开始了。

如果我首先单击带有按钮的普通 UITextView,则该按钮会像这样显示正确。红色方块在键盘上方,所以它可以工作。

如果第一次点击是在带有自定义 inputView 的 UITextView 中,则按钮再次显示正确

但是现在,如果使用工具栏导航(使用简单的resignFirstResponderbecomeFirstResponder),按钮将显示在键盘下方

在简历中......所有问题都只是因为我使用了自定义输入视图。如果我只使用键盘,我不会有任何问题。

要解决这个问题,只需将自定义按钮的 UIView 放在键盘上方即可。我尝试获取主 UIWindows 并发送消息:

[[UIApplication sharedApplication].keyWindow bringSubviewToFront:myview];

但不起作用。有什么办法解决这个错误吗??

【问题讨论】:

    标签: iphone objective-c cocoa-touch ios4 uitextview


    【解决方案1】:

    希望我理解正确,我建议您管理按钮的 Z 位置。这样它就可以出现在所有组件之上。为方便起见,我建议您使用以下开源代码,Manage Z Order of Views。 希望对你有帮助,如果没有请告诉我。

    干杯, 阿伦。

    【讨论】:

      【解决方案2】:

      我修好了。这个想法是找到键盘的 UIView 并像子视图一样添加按钮。这是代码:

      - (void)keyboardDidShow {
          UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
          UIView* keyboard;
          for(UIView* potentialKeyboard in tempWindow.subviews) {
              if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
                  if([[potentialKeyboard description] hasPrefix:@"<UIPeripheralHost"] == YES) {
                      keyboard = potentialKeyboard;
                  } else {
                      if([[potentialKeyboard description] hasPrefix:@"<UIKeyboard"] == YES) {
                          keyboard = potentialKeyboard;
                      }
                  }
              }
          }
          [keyboard addSubview:key];
          [keyboard bringSubviewToFront:key];
      }
      

      【讨论】:

      • 嗯...不确定,但我有一种强烈的感觉,如果您将其提交到应用商店,您可能会被拒绝。不要认为你应该像那样玩他们的内部视图结构。你想用这个实现什么,你只需要一个按钮,它是做什么用的?
      • 这很糟糕。 为什么 if 语句inside for 循环?当没有找到键盘时,这将崩溃。
      • @Joost if 是因为 3.2 以上的版本改变了有键盘的对象的名称。这有2个名字。是的,如果以后Apple改名,我会遇到麻烦...谢谢,我会解决它
      • @GeorgeGreen 因为我必须输入 X,因为用户帐户的基数为 11,就像 ISBN 一样需要 X 作为校验位。
      • @Rodrigo 不是我指的if,我指的是UIDevice systemVersion 检查。这可以而且应该在 for 循环之外完成。
      猜你喜欢
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 2012-09-15
      • 1970-01-01
      相关资源
      最近更新 更多