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;

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

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

4

2 回答 2

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

应该可以正常工作...

于 2012-11-11T09:58:06.153 回答
1

首先,看看这个

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

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

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

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

于 2012-11-11T08:00:47.610 回答