我坚持使用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(@“按钮单击”)消息。没什么特别的。它只是一个简单的样板实现,继续引发错误。
也许我这样做完全错了。任何人都可以提供一个简单的例子吗?
答案 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崩溃的原因。