gpt4 book ai didi

ios - Xcode 6 + 具有多个 View 的 Storyboard + 处理键盘事件

转载 作者:行者123 更新时间:2023-11-28 07:17:14 26 4
gpt4 key购买 nike

我有一个 Xcode 6 应用程序,它使用 Swift 并具有多个 View 。该应用由一系列收集用户响应的屏幕组成。

我想通过将 UITextFields 设置为第一响应者来在 UIViews 加载时触发键盘。我已经通过以下方式注册了监听器来响应键盘事件,因为在屏幕底部需要向上滑动的控件,自定义菜单栏。

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
childAge.becomeFirstResponder()

//Register for keyboard notifications in order to reposition bottom menu
NSNotificationCenter.defaultCenter().addObserver(self, selector: "kbShown:", name: UIKeyboardDidShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "kbHidden:", name: UIKeyboardDidHideNotification, object: nil)

}

然后我删除了 viewWillDissapear 事件中的监听器。

override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
NSNotificationCenter.defaultCenter().removeObserver(self, name:UIKeyboardDidShowNotification, object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self, name:UIKeyboardDidHideNotification, object: nil)

}

这些代码块在所有 UIViewController 类中重复出现。但是,我的问题是,kbShown 函数仅在第一个 View 中被正确触发。在后续 View 中,虽然事件被触发,但菜单栏并未按预期显示。

func kbShown(notification: NSNotification) {
let info = notification.userInfo as NSDictionary

let s:NSValue = info.valueForKey(UIKeyboardFrameEndUserInfoKey) as NSValue;
let rect :CGRect = s.CGRectValue(); //this is the KB rect

//Get Screen Size
var screenRect = UIScreen.mainScreen().bounds // [[UIScreen mainScreen] bounds];
var screenWidth = screenRect.size.width
var screenHeight = screenRect.size.height

var frame = self.menuBar.frame;
frame.origin.y = screenHeight - rect.height - frame.height //menuY! - rect.height;
self.menuBar.frame = frame;

}

func kbHidden(notification: NSNotification) {

var screenRect = UIScreen.mainScreen().bounds // [[UIScreen mainScreen] bounds];
var screenWidth = screenRect.size.width
var screenHeight = screenRect.size.height

var frame = self.menuBar.frame;
if (frame.origin.y != screenHeight - frame.height){
frame.origin.y = screenHeight - frame.height //frame.origin.y + rect.height;
self.menuBar.frame = frame;
}
}

我的 MenuBar View 仍然隐藏在键盘下。但是如果我与 KB 交互并调整它的高度(在 IOS8 中有一个可以向下拖动的预测文本栏),那么 menuBar View 开始显示正常。

此外,如果我将第二个 View 设置为第一个 View Controller ,一切正常。为此损失了几天时间,我们将不胜感激。我做错了什么?

最佳答案

如果您在 viewDidLoad 方法中注册您的观察者,并在第一次消失后在 viewWillDisappear 中删除它们,则不会再次调用键盘处理方法,直到 viewDidLoad是。
发生这种情况是因为在 View Controller 生命周期中 viewDidLoad 仅在需要加载 View 时调用,而不是在显示时调用。下一次可以再次加载相同的 View 是在 View Controller 被释放时,或者可能是在 View 不可见的内存警告事件期间。

将您的 VC 注册为键盘通知观察者的最佳位置是 viewDidAppearviewWillAppear

关于ios - Xcode 6 + 具有多个 View 的 Storyboard + 处理键盘事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25112913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com