uni-app 苹果原生返回关闭原生子窗体后,再次打开子窗体报错

发布于 1周前 作者 htzhanglong 来自 Uni-App

uni-app 苹果原生返回关闭原生子窗体后,再次打开子窗体报错

操作步骤:

  • 打开子窗体后用苹果原生侧滑返回关闭子窗体

预期结果:

  • 应可以再次打开或有办法可以禁用侧滑关闭子窗体

实际结果:

  • 关闭子窗体后无法打开

bug描述:

  • 苹果原生返回关闭原生子窗体后,再次打开子窗体报错,子窗体无法打开
信息类别 信息内容
产品分类 uniapp/App
PC开发环境 Windows
PC系统版本 Windows 10 家庭中文版 21H1
HBuilderX类型 Alpha
HBuilderX版本 3.4.8
手机系统 iOS
手机系统版本 iOS 15
手机厂商 苹果
手机机型 iPhone XR
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

14 回复

请上传一个能重现问题的测试工程


subNVue会随着父webview创建的时候创建。单独关闭subNVue就获取不到子窗体对象了

还有其他办法解决,我稍后写个Demo发给你。

你试试。这样是否符合你的需求

subNVue页面的subNVue.hide()方法要换成subNVue.close()

回复 BoredApe: 换成close依然无法避免苹果原生返回的问题,而且正常通过函数的关闭后也无法在打开了,和苹果原生关闭报一样的错误

回复 1***@qq.com: 你运行的项目对吗?仔细看看 在你的项目基础上改了几个文件。运行我给你这个demo

参考文档:uni-app subNVue 动态打开原生子窗体指南

demo可以,这个文档打不开

回复 1***@qq.com: 打不开? 直接点就可以呀

回复 BoredApe: 打不开,会自动跳转到 https://ask.dcloud.net.cn/explore/

回复 BoredApe: 另外我发的demo里还有一个问题,nvue页面设置的圆角数量大于0 小于 4 的时候,在ios上背景色无法消除

uni-app 中使用原生子窗体时,如果通过苹果原生的返回按钮关闭了子窗体,再次打开子窗体时可能会遇到报错。这通常是因为子窗体的状态没有被正确清理或重置,导致再次打开时出现问题。以下是一些可能的解决方案:

1. 确保子窗体完全关闭

在关闭子窗体时,确保子窗体的状态被正确清理。可以通过监听子窗体的关闭事件来处理一些清理工作。

// 打开子窗体
let subNVue = uni.createSubNVue({
    id: 'subNVueId',
    url: '/pages/subNVue/subNVue',
    style: {
        position: 'absolute',
        top: 0,
        left: 0,
        width: '100%',
        height: '100%',
        backgroundColor: '#FFFFFF'
    }
});

subNVue.show();

// 监听子窗体关闭事件
subNVue.onHide(() => {
    // 在这里进行清理工作
    console.log('子窗体关闭');
});

2. 重新创建子窗体

如果你发现子窗体在关闭后无法再次打开,可以尝试在每次打开子窗体时重新创建它,而不是复用之前的实例。

let subNVue = null;

function openSubNVue() {
    if (subNVue) {
        subNVue.close();
        subNVue = null;
    }
    
    subNVue = uni.createSubNVue({
        id: 'subNVueId',
        url: '/pages/subNVue/subNVue',
        style: {
            position: 'absolute',
            top: 0,
            left: 0,
            width: '100%',
            height: '100%',
            backgroundColor: '#FFFFFF'
        }
    });

    subNVue.show();
}

openSubNVue();

3. 检查子窗体的生命周期

确保子窗体的生命周期方法(如 onLoad, onShow, onHide, onUnload)被正确实现,并且在关闭子窗体时执行必要的清理操作。

export default {
    onLoad() {
        console.log('子窗体加载');
    },
    onShow() {
        console.log('子窗体显示');
    },
    onHide() {
        console.log('子窗体隐藏');
    },
    onUnload() {
        console.log('子窗体卸载');
        // 在这里进行清理工作
    }
}

4. 处理原生返回按钮事件

如果问题是由原生返回按钮引起的,可以通过监听原生返回按钮事件,手动处理子窗体的关闭逻辑。

uni.onBackPress(() => {
    if (subNVue && subNVue.isVisible()) {
        subNVue.close();
        return true; // 阻止默认返回行为
    }
    return false;
});

5. 检查 uni-app 版本

确保你使用的是最新版本的 uni-app,因为一些老版本可能存在已知的 bug,升级到最新版本可能会解决问题。

6. 调试和日志

如果问题依然存在,可以通过添加更多的日志来调试问题,查看在关闭和再次打开子窗体时发生了什么。

console.log('子窗体状态:', subNVue.isVisible());
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!