为iPhone创建一个新的键盘按钮 - InputAccessoryView和InputView中的错误

时间:2012-01-18 19:38:42

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

我在程序中创建了一个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,所以我必须转到“Next”和“Previous”TextView。好的,这只是运行

[textView1 resignFirstResponder];
[textView2 becomeFirstResponder];

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

如果我首先使用按钮点击普通的UITextView,那么按钮显示正确就像这样。红色方块位于键盘上方,因此可以正常工作。

work fine

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

I will not use this way, but work

但是现在,如果navegate带有工具栏(带有一个简单的resignFirstResponderbecomeFirstResponder),按钮将显示在键盘下面

Fail... Fail again...

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

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

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

但不行。有什么想法解决这个bug吗?

2 个答案:

答案 0 :(得分:0)

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

干杯, 阿伦。

答案 1 :(得分:0)

我解决了。想法是找到键盘的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];
}