ios添加自定义inputView

时间:2012-11-11 06:42:08

标签: ios customization nib inputview

我坚持使用iOS中的一个我无法理解的概念,无论我读到多少。我试图用自定义设计覆盖标准iOS数字键盘。当用户触摸UITextField时,我希望显示自定义inputView而不是标准数字键盘。

我创建了一个单独的.h / .M /的.xib的ViewController类我称为“customInputViewController”现在定制inputView,它只是一个黑暗的背景和一个按钮遮盖约一半的屏幕时的UITextField被触摸(类似到数字键盘,但它只是看起来不同)。当我单击自定义inputView中的一个按钮时,我的实现失败 - iOS会抛出EXC_BAD_ACCESS错误。

这是我在运行时加载.xib文件并将自定义inputView附加到UITextField对象的方法:

UIViewController *v = [[customInputViewController alloc] initWithNibName:@"customInputDesign" bundle:nil];
myTextInput.inputView = v.view;

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

也许我这样做完全错了。任何人都可以提供一个简单的例子吗?

2 个答案:

答案 0 :(得分:2)

视图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;
}

应该可以正常工作......

答案 1 :(得分:1)

首先,看看this

  

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

     

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

其实我不需要提到所有这些混乱,但有一个有趣的理由提到这一点,从第一句我提到视图 - 视图,但你是在一个单独的输入视图查看控制器,您正在尝试将其指定为文本字段的输入视图,而init不应该创建视图,loadView会这样做。当视图为nil时调用视图getter(v.view)将导致调用loadView。说明它与EXC_BAD_ACCESS崩溃的原因。

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