SwiftUI主视图调用两个@EnvironmentObject视图时报Extra Argument in Call错误
问题1:调用第二个同类型视图报Extra Argument in call错误
原因
SwiftUI 的body属性要求返回单个视图类型,你直接在body内并列放置两个视图,没有用容器视图包裹,编译器无法将多个视图合并为合法的返回值,就会把第二个视图识别为多余参数。
解决方法
将所有并列子视图放在容器(VStack/HStack/ZStack/Group都可以)中即可,修改后代码示例:
var body: some View { VStack { // 增加容器包裹 FirstEnvironmentObjectView() FirstEnvironmentObjectView() // 此处不再报错 } }
提示:你的代码还有两处小问题可优化:一是
FirstEnvironmentObjectView的body中onTapGesture闭包后缺少闭合大括号;二是结构体命名建议遵循Swift规范使用大驼峰,mainView修改为MainView更合适。
问题2:给视图传入UserInterestsVM的参数取值
分两种场景处理:
- 如果你保持
FirstEnvironmentObjectView中@EnvironmentObject的用法:不需要显式传参,只要保证MainView所在的视图树已经注入了User_Interests_ViewModel实例,子视图会自动从环境中读取该对象。你预览代码中写的.environmentObject(User_Interests_ViewModel())就是注入操作,父级完成注入后子视图直接初始化即可。 - 如果你需要显式传入实例:要么把视图内的
@EnvironmentObject改为@ObservedObject,给视图增加对应的构造参数,调用时直接传入主视图已持有userInterestVM即可;如果不想修改原有@EnvironmentObject的写法,也可以在初始化时单独给子视图注入环境对象,示例如下:
// 方式1:修改为@ObservedObject后的调用写法 FirstEnvironmentObjectView(UserInterestsVM: userInterestVM) // 方式2:保持@EnvironmentObject写法,单独给子视图注入 FirstEnvironmentObjectView() .environmentObject(userInterestVM)
提示:你代码里写的
FirstEnvironment是笔误,实际应该是FirstEnvironmentObjectView。
内容的提问来源于stack exchange,提问作者reasonTo Live
相关产品推荐
相关产品推荐

