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

SwiftUI中DeviceEditorView带参初始化器调用后editMode异常

问题分析与解决方案

问题根源

你调用编辑视图时同时传入了onScreen和editDevice参数,但你定义的两个初始化器都不支持同时接收这两个参数。此时Swift会自动生成一个合成初始化器,这个合成初始化器不会执行你自定义的editMode = true逻辑,导致editMode始终为false。

修复步骤

  1. 修正视图属性定义
    确保DeviceEditorView的属性适配添加/编辑两种模式的需求:

    struct DeviceEditorView: View {
        @Binding var onScreen: Bool
        let editMode: Bool
        let device: Device? // 添加模式下无需传入设备,设为可选类型
        
        // 后续视图代码...
    }
    
  2. 重新定义初始化器
    编写对应两种模式的初始化器,确保所有参数被正确处理:

    // 添加模式初始化器
    init(onScreen: Binding<Bool>) {
        self._onScreen = onScreen
        self.editMode = false
        self.device = nil
    }
    
    // 编辑模式初始化器
    init(onScreen: Binding<Bool>, editDevice: Device) {
        self._onScreen = onScreen
        self.editMode = true
        self.device = editDevice
    }
    
  3. 验证调用逻辑
    现有调用代码无需修改,会自动匹配对应初始化器:

    • 添加设备调用:
      Button(action: {
          showingDeviceManager.toggle()
      }, label: {
          Text("Add Device")
      }) .sheet(isPresented: $showingDeviceManager, content:{
              DeviceEditorView(onScreen: $showingDeviceManager)
          })
      
    • 编辑设备调用:
      Button(action: {
          showingDeviceManager.toggle()
      }, label: {
          Text("Edit Device")
      }).sheet(isPresented: $showingDeviceManager, content:{
              DeviceEditorView(onScreen: $showingDeviceManager, editDevice:device)
           })
      
  4. 额外检查
    确认视图内部没有其他代码意外修改editMode的值,比如在body或其他方法中重新赋值editMode = false。

内容的提问来源于stack exchange,提问作者Echo31416

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:53:18