使用removeFromSuperView删除按钮

时间:2009-07-19 23:22:47

标签: objective-c iphone keyboard

我正在使用这个技巧为数字键盘设置自定义按钮。

但是我在使用它之后无法移除按钮,因此在常规键盘上会出现在视图的顶部。

这是我添加它的方式:

- (void)keyboardShow:(NSValue *)v 
{
    if (isKeyboardNumeric) {
        // create custom button
        UIButton *doneButton = [[UIButton alloc] init];
        //doneButton.buttonType = UIButtonTypeCustom;
        doneButton.frame = CGRectMake(0, 163, 106, 53);
        doneButton.adjustsImageWhenHighlighted = NO;
        if ([[[UIDevice currentDevice] systemVersion] hasPrefix:@"3"]) {
            [doneButton setImage:[UIImage imageNamed:@"DoneUp3.png"] forState:UIControlStateNormal];
            [doneButton setImage:[UIImage imageNamed:@"DoneDown3.png"] forState:UIControlStateHighlighted];
        } else {        
            [doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
            [doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
        }
        [doneButton addTarget:self action:@selector(dismissKeyboard:) forControlEvents:UIControlEventTouchUpInside];
        doneButton.tag = 99;
        // locate keyboard view
        UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
        UIView* keyboard;
        for(int i=0; i<[tempWindow.subviews count]; i++) {
            keyboard = [tempWindow.subviews objectAtIndex:i];
            // keyboard view found; add the custom button to it
            if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
                [keyboard addSubview:doneButton];
        }
    }
}

这就是我如何删除它:

- (void)keyboardHide
{
    UIView *btn;
    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    UIView* keyboard;
    for(int i=0; i<[tempWindow.subviews count]; i++) {
        keyboard = [tempWindow.subviews objectAtIndex:i];
        // keyboard view found; add the custom button to it
        if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES) {
            for (btn in keyboard.subviews) {
                if (btn.tag==99) {
                    [btn removeFromSuperview];
                    [btn release];
                    break;
                }
            }
        }
    }   
    [self setupButtons];
}

两个方法都被正确调用,并且在调试器中我确认称为

[btn removeFromSuperview]

但无论如何,按钮仍然存在。

我尝试将代码放在if (isKeyboardNumeric)调用之前删除它,但没有。

1 个答案:

答案 0 :(得分:4)

这正是Apple告诉你不要这样做的事情,并清楚你知道它,因为你试图通过检查操作系统修订等来保护自己。这是非常脆弱的,这完全有可能会改变内部的小更新或错误修正。在2.x Apple中添加并修改了几个键盘。

你无法获得合理行为这一事实并不令人惊讶,谁知道Apple在键盘视图中做了什么,他们可以重新制作或自定义绘图缓存视图的屏幕图像以提高绘图效率。

如果你想这样做,你应该实现自己的自定义数字键盘,并在需要时将其弹出和弹出。可能不是你想听到的答案,但它可能最终比你在视图中的黑客攻击简单得多,并且不太可能给你的用户造成问题。