uni-app ios原生子弹窗左滑遮罩不消失再次点击就报找不到这个subnvue的id的错

uni-app ios原生子弹窗左滑遮罩不消失再次点击就报找不到这个subnvue的id的错

项目信息 详细信息
产品分类 uniapp/App
PC开发环境 Mac
PC开发环境版本 MacBook Pro (Retina, 13-inch, Late 2013)
HBuilderX类型 正式
HBuilderX版本 3.2.11
手机系统 iOS
手机系统版本 iOS 14
手机厂商 苹果
手机机型 iphone
页面类型 nvue
打包方式 云端
项目创建方式 HBuilderX
App下载地址 维客淘

操作步骤:

创建一个原生子弹窗
在任何的ios设备上运行
左滑页面(想退出,安卓测试没有问题)
页面的遮罩没有消失 再次点击后就消失 重复点击弹窗一直不出来就报找不到这个subnvue的ID的错

预期结果:

侧滑遮罩不消失,再次点击也报错

实际结果:

能像安卓一样侧滑退出这个subnvue,再次点击也可以触发

bug描述:

点击原生子弹窗时候,左滑返回会出现遮罩,点击遮罩消失后再次点击就出现找不到这个子弹窗的id, [JS Framework] Failed to execute the callback function: 17:10:58.461 Error: Unable to find SubNVue, id=imShare __ERROR


更多关于uni-app ios原生子弹窗左滑遮罩不消失再次点击就报找不到这个subnvue的id的错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

用示例代码hello uni-app能出现你的问题吗? 不能的话你需要排查出来具体你哪个页面,甚至哪一行导致的。 找出来具体原因后提供一个能复现你描述的bug的最小化demo,让我们及时定位问题,及时修复。 【bug优先处理规则】https://ask.dcloud.net.cn/article/38139

更多关于uni-app ios原生子弹窗左滑遮罩不消失再次点击就报找不到这个subnvue的id的错的实战教程也可以访问 https://www.itying.com/category-93-b0.html


你好,我直接创建了hello uniapp的项目 因为我想实现点击原生子弹窗点击阴影不消失的场景,所以在style里面给了高度和宽度分别是100%,然后侧滑就会复现这个问题

这是一个已知的iOS原生子窗口(subNVue)的交互问题。当在iOS设备上左滑返回时,子窗口的遮罩层可能无法正确销毁,导致后续操作时系统找不到对应的subNVue实例。

问题原因: iOS的侧滑返回手势与subNVue的关闭机制存在冲突。左滑返回时,subNVue的遮罩层可能未被正确移除,但子窗口实例已被销毁,导致再次调用时找不到对应ID。

解决方案:

  1. 监听页面返回事件: 在父页面中监听onBackPressonNavigationBarButtonTap事件,手动关闭subNVue:

    // 在父页面中
    onBackPress(options) {
      const subNVue = uni.getSubNVueById('imShare')
      if (subNVue) {
        subNVue.hide()
        return true // 阻止默认返回行为
      }
    }
    
  2. 使用遮罩层点击事件: 为subNVue的遮罩层添加点击关闭事件:

    // 在subNVue页面中
    mounted() {
      const mask = uni.getSubNVueById('imShare_mask') // 假设遮罩有独立ID
      if (mask) {
        mask.addEventListener('click', () => {
          uni.getSubNVueById('imShare').hide()
        })
      }
    }
    
  3. 统一关闭管理: 创建统一的subNVue管理函数,确保关闭时完全销毁:

    let currentSubNVue = null
    
    function showSubNVue(id) {
      if (currentSubNVue) {
        currentSubNVue.hide()
      }
      currentSubNVue = uni.getSubNVueById(id)
      currentSubNVue.show()
    }
    
    function hideSubNVue() {
      if (currentSubNVue) {
        currentSubNVue.hide()
        currentSubNVue = null
      }
    }
回到顶部