PushViewController 两次当我双击太快时

2024-01-09

当我调用将 ViewController 推送到详细聊天控制器(一对一聊天)时,我有以下代码。但是,如果我单击得太快,视图控制器将被推送两次。动画我看了两遍。谁能指出我错误在哪里?该代码来自 LBTA 的 Youtube 课程(Firebase Chat)。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let message = messages[indexPath.row]
    guard let chatPartnerId = message.chatPartnerId() else {return}

    let ref = Database.database().reference().child("users").child(chatPartnerId)
    ref.observeSingleEvent(of: .value, with: { (snapshot) in
        guard let dictionary = snapshot.value as? [String: AnyObject] else {
            return
        }
        let user = ChatUser(dictionary: dictionary)
        user.id = chatPartnerId
        self.showChatControllerForUser(user)

    }, withCancel: nil)

}

func showChatControllerForUser(_ user: ChatUser) {
    let chatLogController = ChatLogController(collectionViewLayout: UICollectionViewFlowLayout())
    chatLogController.chatUser = user
    navigationController?.pushViewController(chatLogController, animated: true)
}

为避免此问题,您可以采取的措施是禁用表视图用户交互,并在推送到第二个视图控制器后重新启用它。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // add this:
    tableView.isUserInteractionEnabled = false
    let message = messages[indexPath.row]
    guard let chatPartnerId = message.chatPartnerId() else {return}

    let ref = Database.database().reference().child("users").child(chatPartnerId)
    ref.observeSingleEvent(of: .value, with: { (snapshot) in
        guard let dictionary = snapshot.value as? [String: AnyObject] else {
            return
        }
        let user = ChatUser(dictionary: dictionary)
        user.id = chatPartnerId
        self.showChatControllerForUser(user)

    }, withCancel: nil)

}

func showChatControllerForUser(_ user: ChatUser) {
    let chatLogController = ChatLogController(collectionViewLayout: UICollectionViewFlowLayout())
    chatLogController.chatUser = user
    // edit this:
    navigationController?.pushViewController(chatLogController, animated: true)

    navigationController?.pushViewController(chatLogController, animated: true, completion: {
        self.tableView.isUserInteractionEnabled = true
    })
}

默认情况下,pushViewController(_:animated:) https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621887-pushviewcontroller没有完成处理程序,因此作为解决方法,我们可以添加以下扩展来实现它:

extension UINavigationController {
    public func pushViewController(
        _ viewController: UIViewController,
        animated: Bool,
        completion: @escaping () -> Void)
    {
        pushViewController(viewController, animated: animated)

        guard animated, let coordinator = transitionCoordinator else {
            DispatchQueue.main.async { completion() }
            return
        }

        coordinator.animate(alongsideTransition: nil) { _ in completion() }
    }
}

Cited from: https://stackoverflow.com/a/33767837/5501940 https://stackoverflow.com/a/33767837/5501940

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PushViewController 两次当我双击太快时 的相关文章

  • iOS 绘制圆圈

    我正在尝试在我的 iOS 应用程序中创建下面的圆圈 我知道如何制作圆圈 但不完全确定如何沿着弧线获取点 它必须是代码而不是图像 下面也是我目前拥有的代码 void drawRect CGRect rect CGPoint point poi
  • NSUndoManager 会撤消后台发生的更改吗?

    我有一个编辑视图控制器 我正在使用 NSUndoManager 它是我的持久性存储 核心数据项目 的一组 我的应用程序的功能之一是与外部服务器同步 我想知道的是 如果我正在视图中编辑某些内容 同时应用程序正在与服务器同步 如果我改变主意并决
  • Xamarin 没有安装的配置文件与安装的 iOS 签名身份匹配

    我想知道是否可以在 ios 设备上编译 Xamarin 应用程序 使用 Visual Studio for mac 而无需成为开发人员 费用为 99 美元 年 因为当我尝试在 iPhone 上构建项目时出现此错误 Xamarin iOS C
  • AFNetworking 的 setImageWithURLRequest 在滚动后在错误的单元格中设置图像(iOS、Swift)

    我使用表dequeueReusableCellWithIdentifier and afnetworking uiimageview 我的一些细胞有图像 有些则没有 如果我在加载图像之前滚动表格 成功块会将图像放入重复使用的错误单元格中 例
  • 文本末尾的空格在右对齐 UITextField 中不可见

    我有一个右对齐的UITextField 最初编辑时 文本末尾不会出现空格 我用这个解决了this https stackoverflow com q 19569688 1971013 替换 与不间断的 u00a0 然而 上面仅在编辑文本字段
  • Xcode 10 命令行构建:存档失败,出现 Fabric Info.plist 错误

    我有用于自动构建 iOS 项目的 Jenkins 服务器 该项目有两个目标 使用命令行实用程序构建项目xcodebuild 完整命令是 usr bin xcodebuild workspace Our project xcworkspace
  • 我无法让 HealthKit 工作。缺失的权利

    我很难让 HealthKit 为我的 iOS 应用程序工作 我已经完成了所有步骤到目前为止我已经找到了 http jademind com blog posts healthkit api tutorial 似乎没有一个能解决我的问题 当我
  • 从 NSString 获取子字符串,直到到达特定单词

    假设我有这个NSString Country Address Tel number 我该如何获取之前的子字符串Tel 国家地址 然后我该如何获取后面的子字符串Tel 数字 使用 NSScanner NSString string Count
  • SWIFT:+[CATransaction Synchronize] 在解码 HTML 实体时在事务中调用

    我正在制作一个获取博客 JSON 内容的应用程序 博客文章的标题显示在 tableView 中 获取的标题是 HTML 编码的 所以我用这段代码解码了它们 func configureCell cell UITableViewCell at
  • Swift 4 使用随机密钥解码嵌套 JSON [重复]

    这个问题在这里已经有答案了 我是 Swift 4 的新手 正在尝试从 Wikipedia API 解码此 JSON 我正在努力定义一个结构 因为我发现的所有示例 教程都仅嵌套 1 2 层深度 除此之外 当其中一个密钥是随机的时 如何解码数据
  • 在 Swift 2.0 中隐藏 Home 指示器

    我希望隐藏 Home Indicator 虽然这在 Swift 中很简单 但在 SwiftUI 中似乎并不那么容易 我尝试使用这个 如何使用 SwiftUI 隐藏 home 指示器 https stackoverflow com quest
  • 横向 xib 显示为纵向

    我有一个视图控制器和单独的纵向和横向笔尖文件 旋转时 我加载相应的笔尖 方法 shouldAutorotateToInterfaceOrientation and willRotateToInterfaceOrientation 接到电话
  • 如何使用Appium获取ios中的应用程序信息,例如应用程序版本、设备操作系统版本?

    我正在使用 appium 测试应用程序并将测试输出集成到 testrail 中 我需要在 testrail 中添加设备和应用程序信息 在 Android 中 我可以使用 adb 命令获取应用程序和设备信息 例如设备型号 设备版本和应用程序版
  • 禁用将应用程序窗口置于前面。关闭另一个窗口后

    我有包含 2 个 NSWindowController 的 OSX 应用程序 我的问题可以通过以下几个步骤来描述 使用 2 个窗口启动应用程序 选择另一个应用程序的窗口 将其中一个窗口放在另一个应用程序窗口前面 第二个窗口将保留在底部 关闭
  • Xcode 6 代码编辑器异常行为

    截至最近 我在使用 Xcode 6 代码编辑器时遇到了一些麻烦 最终导致编辑窗口中的焦点快速变化 在编辑文本时跳转到同一文件中完全不同的位置 一切就是这样开始的 最近 编辑器拒绝上下滚动 挂起 停止显示行号或任何其他文本 我该怎么做才能让它
  • 在 UITableView 中创建隐藏的 UISegmentedControl

    与 iBooks 应用程序一样 当您下拉表格视图时 会出现搜索栏和分段控件 以允许您在两种类型的视图之间搜索和切换 当您向下拉得足够远时 它会停留在该位置 或者当您将桌面视图拉得足够远时 它会被隐藏 我正在尝试用一个来实现同样的事情UISe
  • 如何使用 Expo 播放 Youtube 视频

    我正在尝试使用反应本机 YouTube 组件 https github com inProgress team react native youtube在我的世博项目中 但是 我无法让它发挥作用 到目前为止 我所拥有的只是带有红色边框的黑屏
  • 去除iOS输入阴影

    在 iOS Safari 5 上 我必须遵循输入元素 顶部内部阴影 我想删除顶部阴影 错误 webkit appearance不保存 目前的风格是 input border radius 15px border 1px dashed BBB
  • UITableView 自动调整行大小约束在 iPhone 6Plus 上神秘破坏

    我有一个自定义的 UITableViewCell 它有一个缩略图和一堆文本 行高配置为使用自动计算 tableView estimatedRowHeight 129 tableView rowHeight UITableViewAutoma
  • Swift 从照片库中获取视频的 NSData

    我使用 UIImagePickerController 从我的库中选择视频 我需要提取视频文件的 NSData 我使用以下操作从我的库中选择视频 但我的数据似乎为零 但是我的 AVPlayer 播放生成的 NSURL 中的视频 所以我知道问

随机推荐