You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:57:07