inputAccessoryView可以用于实际输入

时间:2012-08-15 16:56:40

标签: ios uitextfield

今天早上,我正在查看我在某处找到的一些旧代码(并在应用程序中使用),它会攻击UIAlertView以获取用户的一串输入。这个目的太过分了,看起来很傻但我从未见过更简单的方法。然后我提出了以下方法,似乎可以工作(iPad 5.1.1和模拟器)。

我的问题有点开放,但基本上,有条件将其作为策略打破:创建带有附件视图的屏幕外文本字段,在附件视图中放置代理文本字段,以及转发代理的各种属性设置?

PMKeyboardTextField.h:

#import <UIKit/UIKit.h>

@interface PMKeyboardTextField : UITextField
- (id)initWithPrompt:(NSString *)prompt;
@end

PMKeyboardTextField.m:

#import "PMKeyboardTextField.h"

@interface PMKeyboardTextField ()
@property (nonatomic, strong) UITextField *inputField;
@end

@implementation PMKeyboardTextField
@synthesize inputField = _inputField;

- (id)initWithPrompt:(NSString *)prompt {
    self = [super initWithFrame:CGRectMake(-1, -1, 1, 1)];
    if (self) {
        UIView *accessory =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 72)];
        [accessory setBackgroundColor:[UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:0.8]];

        UILabel *getLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, 8, 284, 21)];
        [getLabel setBackgroundColor:[UIColor clearColor]];
        getLabel.text = prompt;
        [accessory addSubview:getLabel];

        self.inputField = [[UITextField alloc] initWithFrame:CGRectMake(18, 37, 264, 31)];
        [accessory addSubview:self.inputField];

        self.inputAccessoryView = accessory;
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardDidShow)
                                                     name:UIKeyboardDidShowNotification
                                                   object:nil];
    }
    return self;
}

- (void)keyboardDidShow {
    [self.inputField becomeFirstResponder];
}

- (id<UITextFieldDelegate>)delegate {
    return self.inputField.delegate;
}

- (void)setDelegate:(id<UITextFieldDelegate>)delegate {
    self.inputField.delegate = delegate;
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end

2 个答案:

答案 0 :(得分:2)

如果您的目标是iOS 5.0或更高版本,则无需破解警报视图即可添加文本字段。您只需将警报视图的alertViewStyle设置为UIAlertViewStylePlainTextInput即可为警报视图提供一个纯文本输入字段,然后您可以通过将textFieldAtIndex:发送到警报视图来访问该字段。

除此之外,您的解决方法似乎没问题。我想你必须将你的屏幕外文本字段添加到警报视图的窗口,而不是正常的应用程序窗口。

答案 1 :(得分:2)

尽管我喜欢这个想法,因为它能够避免警报视图的过度混乱或需要重新定位屏幕视图,但在另一个论坛中向我指出了致命的缺陷:有些人使用外部键盘!