0

我通过代码构建了一个自定义键盘。在 self.inputView 上,添加一些按钮来输入自定义内容。核心代码如下:

[self.wordsSenders enumerateObjectsUsingBlock:^(UIButton * _Nonnull cell, NSUInteger idx, BOOL * _Nonnull stop) {
    [self.inputView addSubview:cell];
}];

所有按钮都能准确显示。在 iOS 10 中,inputViewController 可以响应按钮的动作来输入单词。但在 iOS 8.2 或 iOS 9.3 中,按下按钮会导致崩溃,因为无法识别的选择器发送到 0xXXXX。同时,对象,接收按钮的动作,是不同的。inputViewControllerinputWord:没有触发!

- (void)inputWord:(UIButton *)sender {
if ([sender.titleLabel.text isEqualToString:@"字"]) {
    _showSpecialWords = !_showSpecialWords;

    for (int i = 20; i < 28; i ++) {
        if (_showSpecialWords) {
            [self.wordsSenders[i] setTitle:self.specialWords[i - 20] forState:UIControlStateNormal];
        } else {
            [self.wordsSenders[i] setTitle:self.normalWords[i] forState:UIControlStateNormal];
        }
    }
} else {
    [self.textDocumentProxy deleteBackward];
    [self.textDocumentProxy insertText:sender.titleLabel.text];
}
}

对于按钮绑定动作:

[cell addTarget:self action:@selector(inputWord:) forControlEvents:UIControlEventTouchUpInside];

有什么帮助吗?谢谢!

4

1 回答 1

0

哦,对不起,是我的错!我应该维护一个实例变量UIInputViewController而不是构建一个局部变量。在 iOS 10 中,它可以正常工作。可能是因为系统自动维护UIInputViewController实例,而 iOS 8 或 iOS 9 没有。像这样:

CGRect viewFrame = CGRectMake(0.0f, 0.0f, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame) - CGRectGetMaxY(_finishButton.frame) - minusHeight);

_carPlateViewController = [[EPCarPlateViewController alloc] initWithKeyboardType:type hiddenType:hiddenType];
_carPlateViewController.delegate = self;

UIView *inputView = _carPlateViewController.inputView;
inputView.frame = viewFrame;

textField.inputView = inputView;
于 2017-07-23T04:46:07.793 回答