inputAccessoryView 未显示在键盘上方
Posted
技术标签:
【中文标题】inputAccessoryView 未显示在键盘上方【英文标题】:inputAccessoryView not showing above keyboard 【发布时间】:2015-09-19 18:49:40 【问题描述】:Problem relates to this. 我正在尝试使用我制作的具有两个 TextField 输入和一个按钮的自定义视图,我使用 IB 它的 xib 制作它,我已将它放在我的故事板中并将其设置为我的视图底部.
当我想让 ContactInfoView 成为键盘附件视图时,问题就来了。
class ViewController: UIViewController, UITextViewDelegate
@IBOutlet var cameraPreview: UIView!
@IBOutlet weak var ContactInfoView: KeyboardAccessoryView!
override func viewDidLoad()
super.viewDidLoad()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
override func viewWillAppear(animated: Bool)
super.viewWillAppear(animated)
override func viewDidAppear(animated: Bool)
super.viewDidAppear(animated)
//cameraPreviewLayer!.frame = cameraPreview.bounds
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillAppear"), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide"), name: UIKeyboardWillHideNotification, object: nil)
ContactInfoView.NameInput.inputAccessoryView = ContactInfoView
override func viewDidDisappear(animated: Bool)
super.viewDidDisappear(animated)
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
// keyboard stuff
var accessoryView = KeyboardAccessoryView(frame: CGRectZero);
override var inputAccessoryView: KeyboardAccessoryView
return accessoryView
override func becomeFirstResponder() -> Bool
return true
override func canBecomeFirstResponder() -> Bool
return true
func keyboardWillAppear()
print("Keyboard appeared")
func keyboardWillHide()
print("Keyboard hidden")
ContactInfoView.NameInput.inputAccessoryView = ContactInfoView 没有将视图放在键盘顶部。
我把代码弄乱了,它开始与提供的链接相关的崩溃,但尝试该解决方案也不起作用。
【问题讨论】:
【参考方案1】:根据UITextView.h文件中的注释:
@property (nullable, readwrite, strong) UIView *inputView;
@property (nullable, readwrite, strong) UIView *inputAccessoryView;
当对象成为第一响应者时出现。如果设置为 nil,则恢复到跟随响应者链。 如果在第一响应者时设置,则在调用 reloadInputViews 之前不会生效。
你应该在设置 input.. 属性后调用 reloadInputViews 方法。
【讨论】:
【参考方案2】:是的,这看起来有点棘手,因为一切看起来都很好,每个人都一样,Xcode 自动建议和完成工具可以帮助您完成预测的“覆盖”功能..
这是我在显示“inputAccessoryView”时犯的一个简单错误
我输入了 Xcode 建议的文本来完成“inputAccessoryView”和“inputAccessoryView”的覆盖功能。
但是对于添加“覆盖 var inputAccessoryView: UIView?” Func 可以从 Xcode Suggestion / Auto Completion 中选择
override var inputAccessoryView: UIView?
get
return inputContainerView
对于“覆盖 var canBecomeFirstResponder : Bool”,您应该确保 你输入“:Bool”而不是“() - > Bool”,就像我犯了几次错误一样。
所以,如果你愿意的话,你可以自己输入,或者只是复制下面的代码粘贴到你的班级任何地方,它会顺利工作。
override var inputAccessoryView: UIView?
get
let inputContainerView = UIView()
inputContainerView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 50)
inputContainerView.backgroundColor = UIColor.gray
let textfield = UITextField()
textfield.text = "asasfdfs df sdf sdf ds f"
textfield.frame = CGRect(x: 0, y: 0, width: inputContainerView.frame.size.width, height: 50)
inputContainerView.addSubview(textfield)
// You can add Any Other Objects Like UIButton, Image, Label //you want And Constraints too.
return inputContainerView
override var canBecomeFirstResponder : Bool
return true
【讨论】:
【参考方案3】:在上面的代码中,您分配的是属性InputAccessoryView
,而不是属性inputAccessoryView
。案例很重要。
假设其他一切都设置正确,这应该可以让它工作,但有些东西我不明白。为什么您的文本字段/文本视图是您的输入附件视图的属性?如果NameInput
是ContactInfoView
的子视图,那么设置ContactInfoView.NameInput.inputAccessoryView
将不起作用。
【讨论】:
ContactInfoView 在其中有一个 UITextFiels NameInput 我希望 ContactInfoView 位于手机底部,并且当 InputName 被点击时,因为 accssoryView 就像 iMessanger 一样。这更有意义?我应该怎么做呢? 我还尝试向情节提要添加一个虚拟 UItextField 并将其 inputAccessoryView 设置为 ContactInfoView ,但我仍然收到链接中提到的错误。我已尝试按照建议将其从超级视图中删除,但仍然无法正常工作。 所以我找到了this 的帖子。我认为这是您的代码所基于的。我建议尝试第二种方法。我只是不明白第一种方法是如何工作的。简而言之,一个视图不能有两个超级视图,我看不出一个视图如何同时拥有键盘和视图控制器,因为它是超级视图。以上是关于inputAccessoryView 未显示在键盘上方的主要内容,如果未能解决你的问题,请参考以下文章
InputAccessoryView 使用键盘交互显示/隐藏上下移动表格视图
在解除inputAccessoryView设置为toolbarItems的键盘后,toolbarItems消失
UIPageViewController 中的 InputAccessoryView 默认不显示