Ios Scrollview没有';当键盘出现多次时,不能向上移动

Ios Scrollview没有';当键盘出现多次时,不能向上移动,ios,swift,uiscrollview,swift4,Ios,Swift,Uiscrollview,Swift4,我在viewDidLoad()中创建了30个文本字段和var-scrollview:UIScrollView,并试图在键盘覆盖文本字段时向上移动整个滚动视图委托。 这段代码(下方)可以工作,当键盘第一次出现时,scrollview会向上移动,但问题是,当键盘第二次或更多次打开时,scrollview不会向上移动。我已经几个小时没能解决这个问题了。有人能检测出我代码中的一些错误并给我正确的答案吗?我期待任何帮助 我编写的代码如下: var activeField: UITextField? fu

我在
viewDidLoad()
中创建了30个文本字段和
var-scrollview:UIScrollView
,并试图在键盘覆盖文本字段时向上移动整个滚动视图<已设置文本字段和滚动视图的代码>委托。 这段代码(下方)可以工作,当键盘第一次出现时,scrollview会向上移动,但问题是,当键盘第二次或更多次打开时,scrollview不会向上移动。我已经几个小时没能解决这个问题了。有人能检测出我代码中的一些错误并给我正确的答案吗?我期待任何帮助

我编写的代码如下:

var activeField: UITextField?

func registerForKeyboardNotifications(){
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notificaiton:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func deregisterForKeyboardNotifications(){
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.removeObserver(self, name:NSNotification.Name.UIKeyboardWillHide, object: nil)
}

@objc func keyboardWasShown(notificaiton: NSNotification){
    var info = notificaiton.userInfo!
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0)
    var aRect: CGRect = view.frame
    aRect.size.height -= keyboardSize!.height

    if let activeField = activeField{
        if !aRect.contains(activeField.frame.origin) == true{
            scrollview.contentInset = contentInsets
        }
    }
}

@objc func keyboardWillBeHidden(notification: NSNotification){
    view.endEditing(true)
}

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool{
    activeField = textField
    registerForKeyboardNotifications()
    return true
}

func textFieldDidEndEditing(_ textField: UITextField){
    activeField = nil
    deregisterForKeyboardNotifications()
}

朋友,请试试这段代码。希望它也能对你有用。我正在使用这个,它工作得很好

 override func viewDidLoad(){
    NotificationCenter.default.addObserver(self,selector: #selector(self.keyboardDidShow(notification:)),
    name: UIResponder.keyboardDidShowNotification, object: nil)
    NotificationCenter.default.addObserver(self,selector: #selector(self.keyboardDidHide(notification:)),
    name: UIResponder.keyboardDidHideNotification, object: nil)
}

//MARK: Methods to manage keybaord
@objc func keyboardDidShow(notification: NSNotification) {
    var info = notification.userInfo
    let keyBoardSize = info![UIKeyboardFrameEndUserInfoKey] as! CGRect
    scrollView.contentInset = UIEdgeInsetsMake(0.0, 0.0, keyBoardSize.height, 0.0)
    scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0, 0.0, keyBoardSize.height, 0.0)
}

@objc func keyboardDidHide(notification: NSNotification) {
    
    scrollView.contentInset = UIEdgeInsets.zero
    scrollView.scrollIndicatorInsets = UIEdgeInsets.zero
}

我为swift 4.0编写了这段代码。

管理多个文本字段滚动并在每个viewcontroller中添加多行代码确实占用了大部分开发时间,但幸运的是,我们有了一个代码数量较少的替代解决方案 您只需在
didfishlaunchingwithoptions

IQKeyboardManager.sharedManager().enable = true
这将处理整个项目

希望这对你有帮助

只需使用键盘管理器

  • 首先安装吊舱
  • 在AppDelegate.swift中第二次导入IQKeyboardManagerSwift
  • 第三次写入IQKeyboardManager.shared.enable=true didFinishLaunchingWithOptions函数
@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  IQKeyboardManager.shared.enable = true

  return true
}}

不要在
textfielddidediting
中调用
deregisterForKeyboardNotifications
,但在视图控制器消失之前,我尝试在
viewwilldispread
中编写这些代码,但键盘关闭时似乎不会调用此方法。谢谢您的解决方案。事实上,我是一个初学者,我不知道如何使用图书馆,所以这是一个很好的机会让我了解它。谢谢(很抱歉,我没有足够的声誉来支持您的解决方案)如果您得到了足够的解决方案,声誉不是问题:)IQKeyboardManager不使用滚动视图。谢谢,此代码工作得非常好。非常感谢您的解决方案!我真的很想提高这一点,但很抱歉,我没有达到足够的声誉这样做。