15

我正在尝试在我的应用程序中使用自定义键盘,但是在尝试将其限制为一个特定的 UITextField 时遇到了问题。

我的代码基于这个 Xcode 项目(最初在这个博客上找到)。该代码将自定义 UIButton(表示“小数点”)添加到 UIKeyboardTypeNumberPad 键盘视图中。它通过订阅 UIKeyboardWillShowNotification 并在键盘出现时修改键盘来实现。

该 Xcode 项目效果很好,但是当我添加一个额外的 UITextField 时,即使我为该文本字段选择了完全不同的键盘类型,自定义键也会被放入该文本字段的键盘中。

我尝试注册以仅查看来自一个特定 UITextField 的 UIKeyboardWillShowNotification 通知,但这似乎不起作用:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:exampleViewController.textField];

我还尝试检查传递给keyboardWillShow的NSNotification内的对象,但不幸的是它指的是键盘,而不是导致键盘出现的UI控件。

2009-10-21 19:50:22.205 Example[6302:207] NSConcreteNotification 0x321ebd0 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 0;
UIKeyboardAnimationDurationUserInfoKey = 0.300000011920929;
UIKeyboardBoundsUserInfoKey = NSRect: {{0, 0}, {320, 216}};
UIKeyboardCenterBeginUserInfoKey = NSPoint: {160, 588};
UIKeyboardCenterEndUserInfoKey = NSPoint: {160, 372};

}}

我误解了 addObserver 接口吗?肯定有一种方法可以订阅来自特定 UI 控件的通知吗?

有人对如何实现这一目标有任何其他建议吗?

4

5 回答 5

25

无法使上述任何一项工作。必须手动完成:

if ([companyName isFirstResponder]) {
    // ...............
}
else if ([notes isFirstResponder]) {
    //.............
    }
}
于 2010-05-16T18:01:02.987 回答
3

您可以编写一个 UIView 类别方法来查找第一响应者。

- (UIView *)firstResponder
{
    if ([self isFirstResponder])
    {
        return self;
    }

    for (UIView *view in self.subviews)
    {
        UIView *firstResponder= [view firstResponder];
        if (firstResponder)
        {
            return firstResponder;
        }
    }

    return nil;
}

然后在你的- (void)keyboardWillShow:(NSNotification *)notification方法中你可以像这样使用它

  UITextField *textField = (UITextField *)[self firstResponder];
于 2015-05-11T12:16:41.930 回答
0

该项目效果很好,但是当我添加一个额外的 UITextField 时,自定义键也会被放入该文本字段的键盘中。

您可以为实例设置键盘类型UITextField,例如:

[myTextField setKeyboardType:UIKeyboardTypeDefault];

或者:

myTextField.keyboardType = UIKeyboardTypeDefault;

在 Xcode 帮助中搜索常量UITextInputTraits Protocol列表。UIKeyboardType

于 2009-10-22T01:29:04.460 回答
0

@berilcetin 答案的快速版本。

extension UIView {
  var firstResponder: UIView? {
    if self.isFirstResponder {
        return self
    }
    return getSubView(views: self.subviews)
  }

  private func getSubView(views: [UIView]) -> UIView? {

    guard subviews.count > 0 else {
        return nil
    }
    if let responder = views.filter({ $0.isFirstResponder }).first {
        return responder
    }
    for responder in views {
        if let view = getSubView(views: responder.subviews) {
            return view
        }
    }
    return .none
 }
}

用法

yourView.firstResponder as? UITextField.

如果你正在工作UITableViewCell

for cell in tableView.visibleCells {
        if let view = cell.contentView.firstResponder as? UITextField {
            // view ...

            break
        }
    }
于 2021-07-30T08:26:01.547 回答
-2

我之前通过将对象与我感兴趣的 UI 对象进行比较来实现这一点。像这样:

if(notification.object == exampleViewController.textField)
{
  ...
}
于 2009-11-24T16:20:26.453 回答