2012-11-11 45 views
4

我困在iOS中的一个概念,我无法理解,无论我读了多少。我试图用自定义设计来覆盖标准的iOS数字键盘。当用户触摸UITextField时,我想要显示自定义inputView而不是标准数字键盘。ios添加自定义输入查看

我为我的自定义inputView创建了一个名为“customInputViewController”的单独的.h/.m/.xib ViewController类,它只是一个黑色的背景和一个按钮,当UITextField被触摸时会遮住大约一半的屏幕类似于数字键盘,但它看起来不同)。当我单击自定义inputView中的一个按钮时,我的实现失败 - iOS引发EXC_BAD_ACCESS错误。

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

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

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

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

回答

1

首先,看看this

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

。如果您的应用程序正在使用的UITextView和文本编辑 UITextField对象,只需指定自定义视图 的inputView和inputAccessoryView性能得到这个功能。这些自定义视图 显示当文本对象成为第一个响应者...

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

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

2

视图v.view被保留作为inputView属性被定义为(读写,保留)。但是,如果你的地方释放你的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

我已经过了所有的例子,包括一个[这里](http://blog.carbonfive.com/2012/03/12/customizing-the-ios-keyboard/),他们都想要将自定义inputView放入主视图的xib中。我想构建一些不那么耦合的东西,比如一个单独的inputView类,它可以从笔尖初始化并设置为响应我附加到的任何文本字段。 – Marc

+0

只要您不释放拥有该视图的视图控制器,您的代码就可以正常运行。该视图由UITextField保留,但视图控制器不是。无论如何,你可以创建一个包含你自己的UIView子类的xib,并使用KeyboardView加载* view [[NSBundle loadNibNamed:@“KeyboardView”owner:nil options:nil] lastObject]。这样你就不需要使用额外的视图控制器,所以你不必担心它。 –