Ios 键盘上方未显示inputAccessoryView

Ios 键盘上方未显示inputAccessoryView,ios,swift,inputaccessoryview,Ios,Swift,Inputaccessoryview,我试图使用一个自定义视图,它有两个文本字段输入和一个按钮,我使用IB-its-xib创建它,我将它放在我的故事板中,并将它设置在视图的底部 当我想让ContactInfo查看键盘附件视图时,问题就出现了 class ViewController: UIViewController, UITextViewDelegate { @IBOutlet var cameraPreview: UIView! @IBOutlet weak var ContactInfoView: KeyboardAcces

我试图使用一个自定义视图,它有两个文本字段输入和一个按钮,我使用IB-its-xib创建它,我将它放在我的故事板中,并将它设置在视图的底部

当我想让ContactInfo查看键盘附件视图时,问题就出现了

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未将视图置于键盘顶部


我愚弄了代码,它开始崩溃,与提供的链接相关,但尝试该解决方案也不起作用。

在上面的代码中,您分配的是属性
InputAccessoryView
而不是属性
InputAccessoryView
。案例很重要


假设其他一切都设置正确,这应该可以让它工作,但有一点我不明白。为什么文本字段/文本视图是输入附件视图的属性?如果
NameInput
ContactInfoView
的子视图,则设置
ContactInfoView.NameInput.inputAccessoryView
将不起作用。

在上面的代码中,您分配的是属性
inputAccessoryView
而不是属性
inputAccessoryView
。案例很重要


假设其他一切都设置正确,这应该可以让它工作,但有一点我不明白。为什么文本字段/文本视图是输入附件视图的属性?如果
NameInput
ContactInfoView
的子视图,则设置
ContactInfoView.NameInput.inputAccessoryView
将不起作用。

根据UITextView.h文件中的注释:

@property (nullable, readwrite, strong) UIView *inputView;             
@property (nullable, readwrite, strong) UIView *inputAccessoryView;
当对象成为第一响应者时显示。如果设置为nil,则返回到以下响应程序链如果在第一响应程序时设置,则在调用reloadInputViews之前不会生效。


您应该在设置输入后调用reloadInputViews方法。。属性。

根据UITextView.h文件中的注释:

@property (nullable, readwrite, strong) UIView *inputView;             
@property (nullable, readwrite, strong) UIView *inputAccessoryView;
当对象成为第一响应者时显示。如果设置为nil,则返回到以下响应程序链如果在第一响应程序时设置,则在调用reloadInputViews之前不会生效。


您应该在设置输入后调用reloadInputViews方法。。属性。

是的,这看起来有点棘手,因为一切看起来都很好,与每个人一样,Xcode自动建议和完成工具帮助您完成预期的“覆盖”功能

下面是我在显示“inputAccessoryView”时犯的一个简单错误

我输入了Xcode建议文本以完成覆盖函数的“inputAccessoryView”和“inputAccessoryView”

但是对于添加“override var inputAccessoryView:UIView?”函数,可以从Xcode建议/自动完成中选择

    override var inputAccessoryView: UIView? {
        get {
           return inputContainerView
        }
    }
对于“override 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
}

是的,这看起来有点棘手,因为一切看起来都很好,和每个人一样,Xcode自动建议和完成工具帮助您完成预测的“覆盖”功能

下面是我在显示“inputAccessoryView”时犯的一个简单错误

我输入了Xcode建议文本以完成覆盖函数的“inputAccessoryView”和“inputAccessoryView”

但是对于添加“override var inputAccessoryView:UIView?”函数,可以从Xcode建议/自动完成中选择

    override var inputAccessoryView: UIView? {
        get {
           return inputContainerView
        }
    }
对于“override 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
}

ContactInfoView中有一个UITextFiels名称Input我希望ContactInfoView位于手机底部,当点击InputName时,它会显示出来,因为AccountoryView就像iMessanger那样做。这更有意义吗?我还尝试过在故事板中添加一个虚拟UItextField,并将其inputAccessoryView设置为ContactInfoView,但我仍然收到了链接中提到的错误。我试着按照建议从超级视图中删除它,但仍然不起作用。所以我找到了这篇文章。我想这就是你代码的基础。我建议尝试第二种方法。我只是不明白第一种方法是如何工作的。简单地说,一个视图不能有两个superview,我看不出一个视图如何同时具有键盘和视图控制器作为它的superview。ContactInfoView中有一个UITextFiels名称Input我希望ContactInfoView位于手机的底部,当点击InputName时,它会显示出来,因为AccosoryView就像iMessanger那样。这更有意义吗?我还尝试过在故事板中添加一个虚拟UItextField,并将其inputAccessoryView设置为ContactInfoView,但我仍然收到了链接中提到的错误。我试着按照建议从超级视图中删除它,但仍然不起作用。所以我找到了这篇文章。我想这就是你代码的基础。我建议尝试第二种方法。我只是不明白第一种方法是如何工作的。简单地说,一个视图不能有两个superview,我看不出一个视图如何同时具有键盘和视图控制器作为它的superview。