iOS添加自定义输入视图

5
我在iOS中遇到了一个概念难题,无论我读了多少都无法理解。我试图用自定义设计覆盖标准iOS数字键盘。当用户触摸UITextField时,我希望自定义的inputView代替标准数字键盘。
我为自定义inputView创建了一个单独的.h/.m/.xib ViewController类,名为"customInputViewController"。现在,它只是一个黑色背景和一个按钮,当UITextField被触摸时会遮挡大约一半屏幕(类似于数字键盘,但它看起来不同)。当我点击自定义inputView中的一个按钮时,我的实现失败了--iOS抛出了一个EXC_BAD_ACCESS错误。
以下是我如何在运行时加载.xib文件并将自定义inputView附加到UITextField对象上:
UIViewController *v = [[customInputViewController alloc] initWithNibName:@"customInputDesign" bundle:nil];
myTextInput.inputView = v.view;

在自定义输入视图的.xib文件中,我将文件所有者设置为“customInputViewController”,并创建了一个(IBAction)方法并将其附加到UIButton上。当单击该按钮时,(IBAction)被设置为发送NSLog(@"Button Clicked")消息。没有什么特别的,这只是一个简单的样板实现,但它继续抛出错误。
也许我完全做错了。有人能提供一个简单的例子吗?
2个回答

2

由于inputView属性被定义为(readwrite,retain),因此视图v.view会被保留。但是,如果在输入按钮被点击之前释放了自定义输入视图控制器v,则会导致崩溃(EXC_BAD_ACCESS)。

您可以在主控制器中尝试此操作:

- (IBAction) keyboardButtonClicked
{
    NSLog(@"keyboard Button Clicked");
}

- (void) viewDidLoad
{
    // do your stuff here ...

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; // add autorelease if you don't use ARC
    v.backgroundColor = [UIColor darkGrayColor];
    UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
    [b setTitle:@"Test button" forState:UIControlStateNormal];
    [b addTarget:self action:@selector(keyboardButtonClicked) forControlEvents:UIControlEventTouchUpInside];
    b.frame = CGRectMake(80, 25, 160, 50);
    [v addSubview:b];
    myTextInput.inputView = v;
}

应该能正常工作...


1
我已经查看了所有的示例,包括这里的示例,它们都想把自定义的inputView放在主视图的xib中。我想构建一个不那么耦合的东西,比如一个单独的inputView类,可以从nib初始化,并设置为响应我附加到它的任何文本字段。 - Marc
只要不释放拥有视图的视图控制器,您的代码就可以正常运行。UITextField 会保留视图,但视图控制器不会。无论如何,您可以创建一个包含自己的 UIView 子类的 xib,并使用 KeyboardView *view = [[NSBundle loadNibNamed:@"KeyboardView" owner:nil options:nil] lastObject] 加载。这样,您就不需要使用额外的视图控制器,因此您就不必担心它。 - Jose Servet

1

首先,看一下this

UIKit框架包括对自定义输入视图和输入附件视图的支持。当用户在视图中编辑文本或其他形式的数据时,您的应用程序可以替换系统键盘为其自己的输入视图。例如,应用程序可以使用自定义输入视图来输入符文字母。您还可以将输入附件视图附加到系统键盘或自定义输入视图;此附件视图沿着主输入视图的顶部运行,可以包含影响文本某些方面的控件或显示有关文本的某些信息的标签。

如果您的应用程序正在使用UITextView和UITextField对象进行文本编辑,则只需将自定义视图分配给inputView和inputAccessoryView属性即可获得此功能。当文本对象成为第一响应者时,这些自定义视图会显示...

其实我不需要向你提及这一切混乱,但是有一个有趣的原因让我提到这个问题。从第一句话开始,我就提到了view-view-view,但是你却将输入视图放在了一个单独的视图控制器中,并试图将其分配为文本字段的输入视图,而init不应该创建视图,loadView才会这样做。当视图为空时调用视图getter(v.view)将导致loadView被调用。这就是为什么它会崩溃并显示EXC_BAD_ACCESS的原因。

来源:iOS的文本、Web和编辑编程指南


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接