0

问题与此有关。 我正在尝试使用我制作的具有两个 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 没有将视图放在键盘顶部。

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

4

3 回答 3

3

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

@property (nullable, readwrite, strong) UIView *inputView;             
@property (nullable, readwrite, strong) UIView *inputAccessoryView;

当对象成为第一响应者时呈现。如果设置为 nil,则恢复到跟随响应者链。 如果在第一响应者时设置,则在调用 reloadInputViews 之前不会生效。

您应该在设置 input.. 属性后调用 reloadInputViews 方法。

于 2017-06-21T10:28:29.260 回答
1

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

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

我输入了 Xcode 建议的文本来完成“inputAccessoryView”和“inputAccessoryView”的覆盖功能。

但是对于添加“覆盖 var inputAccessoryView:UIView?” Func 可以从 Xcode Suggestion / Auto Completion 中选择

    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
}
于 2017-10-19T18:53:27.750 回答
0

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

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

于 2015-09-19T19:29:48.153 回答