我正在尝试在我的应用程序中使用自定义键盘,但在尝试将其限制为一个特定的UITextField时,我遇到了问题。
我的代码基于this Xcode project(最初在this blog上找到)。该代码将自定义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控件的通知吗?
有没有人就如何实现这个目标提出任何其他建议?
答案 0 :(得分:23)
无法获得上述任何功能。不得不手动完成:
if ([companyName isFirstResponder]) {
// ...............
}
else if ([notes isFirstResponder]) {
//.............
}
}
答案 1 :(得分:2)
您可以编写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];
答案 2 :(得分:0)
该项目效果很好,但是当我添加额外的UITextField时,自定义键也会被放入该文本字段的键盘中。
您可以为UITextField
实例设置键盘类型,例如:
[myTextField setKeyboardType:UIKeyboardTypeDefault];
或:
myTextField.keyboardType = UIKeyboardTypeDefault;
在UITextInputTraits Protocol
上搜索Xcode帮助,获取UIKeyboardType
个常量列表。
答案 3 :(得分: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
}
}
答案 4 :(得分:-2)
我之前通过将对象与我感兴趣的UI对象进行比较来实现此目的。就像这样:
if(notification.object == exampleViewController.textField)
{
...
}