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 |
请上传一个能重现问题的测试工程
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());