ios添加自定义inputView

Posted

技术标签:

【中文标题】ios添加自定义inputView【英文标题】:ios adding custom inputView 【发布时间】:2012-11-11 06:42:07 【问题描述】:

我在 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;

在自定义 inputView 的 .xib 文件中,我将 File's Owner 设置为“customInputViewController”,并创建了一个 (IBAction) 方法并将其附加到 UIButton。单击该按钮时, (IBAction) 设置为发送 NSLog(@"Button Clicked") 消息。没什么特别的。这只是一个持续抛出错误的简单样板实现。

也许我这样做完全错了。谁能提供一个简单的例子?

【问题讨论】:

【参考方案1】:

视图 v.view 被保留,因为 inputView 属性被定义为 (readwrite, retain)。但是,如果您在单击输入按钮之前在某处释放 customInputViewController 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;

应该可以正常工作...

【讨论】:

我浏览了所有示例,包括here,他们都希望将自定义 inputView 放在主视图的 xib 中。我想构建一些不那么耦合的东西,例如一个单独的 inputView 类,它可以从一个 nib 初始化并设置为响应我附加到的任何文本字段。 只要您不释放拥有该视图的视图控制器,您的代码就会运行良好。视图由 UITextField 保留,但视图控制器不是。无论如何,您可以创建一个包含您自己的 UIView 子类的 xib 并使用 KeyboardView *view = [[NSBundle loadNibNamed:@"KeyboardView" owner:nil options:nil] lastObject] 加载。这样你就不需要使用额外的视图控制器,所以你不必担心它。【参考方案2】:

首先,看看this

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

如果您的应用程序正在使用 UITextView 和 用于文本编辑的 UITextField 对象,只需将自定义视图分配给 inputView 和 inputAccessoryView 属性。那些自定义视图 当文本对象成为第一响应者时显示...

实际上我不需要向您提及所有这些混乱,但是提及这一点有一个有趣的原因,从第一句话开始我就提到了view-view-view,但是您将输入视图单独制作视图控制器,您尝试将其分配为文本字段的输入视图,而 init 不应该创建视图, loadView 会这样做。当 view 为 nil 时调用 view getter (v.view) 将导致 loadView 被调用。这就是它与 EXC_BAD_ACCESS 崩溃的原因。

来源:Text, Web, and Editing Programming Guide for iOS

【讨论】:

以上是关于ios添加自定义inputView的主要内容,如果未能解决你的问题,请参考以下文章

iOS IM开发建议添加一个自定义键盘

iOS 8中具有动态高度的自定义inputView

IOS10 - 在自定义 inputView 中使用 CollectionView

UISearchBar 的自定义 InputView 在 iOS7 中不起作用

适用于iPhone X的自定义键盘inputView.frame大小

自定义 inputView 在模态演示期间未正确设置动画