【问题标题】:IQKeyboardManager not working when UITableView embedded in a container view当 UITableView 嵌入到容器视图中时,IQKeyboardManager 不起作用
【发布时间】:2016-12-10 16:08:54
【问题描述】:

目前,我正在使用嵌入了UITableView 的容器视图,并且正在使用IQKeyboardManager CocoaPod 滚动视图,因此我的UITextFieldsUITextViews 不会被键盘覆盖。

我可以成功 import IQkeyboardManager 并使其在其他视图中工作,但是当 UITableView 嵌入到容器视图中时它不起作用。

【问题讨论】:

  • 我已经澄清了您的问题,但仍然没有足够的信息来提供帮助。显示执行此操作的类的完整代码。

标签: ios swift uitableview uicontainerview iqkeyboardmanager


【解决方案1】:
    -(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:YES]; // This line is needed for the 'auto slide up'
   // Do other stuff
}

简单的解决方案,无需创建观察者。

【讨论】:

  • 太棒了! ,拯救了我的一天!
  • 谢谢 - 我现在也在用这个。出于好奇 - 这是否有效,因为它确保 IQKeyboardManager 类在视图控制器中的类之前执行?
  • 一行代码太麻烦了,我花了至少 4 个小时才弄清楚这就是我所缺少的。非常感谢!
  • 我用最新的 IQKeyboardManagerSwift (4.0.10) 尝试了这个解决方案,但没有成功。
  • 很棒的答案...拯救了我的一天...荣誉
【解决方案2】:

我遇到了类似的问题,并使用图书馆作者提供的here 信息修复了它。

关键语句是:

库逻辑是从 textField 中找到最近的 scrollView。在您的情况下,它是 tableView,这就是库选择 tableView 滚动的原因。

所以我使用的解决方案是在编辑文本字段/视图时禁用 UITableView 滚动属性(使用委托方法),然后在编辑完成后重新启用它。这确保了库不会将 UITableView 检测为可滚动,因此它会忽略它,然后移动您的容器视图 - 如您所愿。一旦视图按照您的意愿向上移动,您可以通过 UIKeyboardWillShowNotification 重新启用滚动。

例如,对于 UITextField:

-(void) textFieldDidBeginEditing:(UITextField *)textField {
    [self.tableView setScrollEnabled:NO];
}

- (void) textFieldDidEndEditing:(UITextField *)textField {
  [self.tableView setScrollEnabled:YES];
}

但是在视图向上移动后仍然允许滚动,我已经注册了键盘通知,然后在键盘启动后允许滚动:

-(void) keyboardWillShow {
    [self.tableView setScrollEnabled:YES];
}


- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow)
                                                 name:UIKeyboardWillShowNotification
                                               object:nil];

}

【讨论】:

  • 您的解决方案似乎非常合乎逻辑,但即使我在 viewDidLoad() 中使 tableview 不可滚动,它也对我不起作用..您知道为什么会发生这种情况吗?
【解决方案3】:

感谢@vivek agravat 解答! 这是快速版本:

 override func viewWillAppear(_ animated: Bool) {
          super.viewWillAppear(true)
}

【讨论】:

    【解决方案4】:

    尝试滚动所有视图

    在 viewDidLoad 中

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourVC.keyboardWillShow(_:)), name:UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourVC.keyboardWillHide(_:)), name:UIKeyboardWillHideNotification, object: nil)
    

    之后

    func keyboardWillShow(notification:NSNotification)
        {
            if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue()
            {
                self.view.frame.origin.y -= keyboardSize.height
            }
        }
    
        func keyboardWillHide(notification:NSNotification)
        {
            if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue()
            {
                self.view.frame.origin.y += keyboardSize.height
            }
        }
    

    你可以改keyboardSize

    【讨论】:

    • 你误解了这个问题。他正在使用 CocoaPod 来处理滚动,而不是整个视图应该移动到这里——tableview 应该滚动。