【问题标题】:inputAccessoryView disappears after presenting UIViewController呈现 UIViewController 后 inputAccessoryView 消失
【发布时间】:2017-11-05 12:18:58
【问题描述】:

我有一个带有 inputAccessoryView 的 UICollectionViewController。在我呈现 UIViewController 之前,一切都很好,然后附件视图消失了。尝试获得基本的聊天应用程序功能。

我已经在集合视图中实现了:

override var inputAccessoryView: UIView? {
    get {
        return inputContainerView
    }
}

override var canBecomeFirstResponder: Bool {
    return true
}

override func becomeFirstResponder() -> Bool {
    return true
}

正如多个其他线程中所建议的,我也调用(在集合视图中),

view.resignFirstResponder()
view.inputAccessoryView?.reloadInputViews()
view.becomeFirstResponder()

在关闭 UIViewController 但无济于事之后。 print(view.isFirstResponder) 仍然打印false。我已经在代码中的许多不同位置尝试了上述三行的几乎所有组合。我想我错过了一些简单的东西。

【问题讨论】:

  • 有趣。我以为只有 textFields 和 textViews 有一个 inputAccessoryView ......无论如何:我认为 inputAccessoryView 在屏幕上它所属的视图必须是当前响应者......但是因为你提供了一个 viewControlle......它已经辞职了,现在你需要让它的视图再次成为 firstResponder ......我猜一个快速的解决方案是将view.becomeFirstResponder() 放在你的viewDidAppear 中,以确保每次进入屏幕时 inputAccessoryView 都在那里。跨度>
  • 我在这里找到的,如果你真的感兴趣,请跳到15:00:youtube.com/watch?v=ky7YRh01by8谢谢你的建议!
  • 我的建议有用吗?!
  • 不幸的是它没有....出于某种原因,每当我调用 becomeFirstResponder 时,它都无法正常工作
  • 更新:对您的建议稍作修改......我使用viewDidAppear(我从未使用过)来展示 loginController 并且它有效。我从来不用打电话给view.becomeFirstResponder() 我下面的计时器方法基本上完成了同样的事情,但这不那么老套和专业。非常感激。我会记住的

标签: ios uiviewcontroller swift3 xcode8 inputaccessoryview


【解决方案1】:

显示和关闭视图控制器的动画可能会导致问题,或者您没有为已设置为输入附件视图的视图维护全局 ivar。尝试为附件视图创建一个只读 ivar,以便在整个 VC 生命周期中只分配和维护一个实例。然后确保在调用 reloadInputViews 之前将其设置回文本字段。

【讨论】:

  • 感谢您的回答!我投了赞成票,但我的代表少于 15 个
【解决方案2】:

几天后,我终于找到了可行的方法...我想我是在将 collectionView 设置为第一响应者之前尝试呈现 loginController。我不只是调用present,而是调用了这个函数:

func presentLoginControllerAfterImFirstResponder(fromUser: Bool) {
    // Starts a timer
    Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { (timer) in
        // Is this view the first responder?
        if self.isFirstResponder {
            // Creates the loginController
            let loginController = LoginController()
            // Presents it
            self.present(loginController, animated: fromUser, completion: {
                // Once presented, sets rootViewController = self
                loginController.rootViewController = self
            })
            // Stop the timer
            timer.invalidate()
        }
    }
}

现在可以了。我猜 collectionView 需要一些时间来将自己设置为第一响应者?我可以呈现和关闭 loginController 没有问题,并且 inputAccessoryView 仍然存在。

【讨论】:

    猜你喜欢
    • 2018-11-16
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多