使用 SwiftUI 选择器,我的 MacBook 加热到 50 度

Posted

技术标签:

【中文标题】使用 SwiftUI 选择器,我的 MacBook 加热到 50 度【英文标题】:Used SwiftUI picker and my MacBook heats up to 50 degrees 【发布时间】:2019-08-12 05:49:08 【问题描述】:

只要我使用密码,我的 MacBook 就会升温到 50 度。我有 4 个枚举,每个都有一个选择器,只要我将 3 个选择器放入 if-else 语句然后调试,我的 MacBook 就会发热,我几乎不能再触摸它了。 错误 ->

编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式

我使用带有 Int16、Hashable、CaseIterable 协议的枚举。 我想要 Int16 作为我的 CoreData 属性。 如果我将 Int16 更改为 Int 则代码有效.. 我将“标签”转换为 int,这样我就可以使用 else if 语句。

Import SwiftUI
struct EnumsInEnums: View 
          @State  var pickMain = 0
          @State  var pickA = 0
          @State  var pickB = 0
          @State  var pickC = 0

enum MainEnum :  Int16, Hashable, CaseIterable
        
        case AEnum
        case BEnum
        case CEnum
        var name: String  return "\(self)" 
        
enum AEnum :  Int16, Hashable, CaseIterable
        
        case Aa
        case Ba
        case Ca
        var name: String  return "\(self)" 
        
enum BEnum :  Int16, Hashable, CaseIterable
        
        case Ab
        case Bb
        case Cb
        var name: String  return "\(self)" 
        
enum CEnum :  Int16, Hashable, CaseIterable
        
        case Ac
        case Bc
        case Cc
        var name: String  return "\(self)" 

var body: some View 
 NavigationView 
  Form 
   Section 

   Picker(selection: $pickMain, label: Text("Pick \(pickMain)")) 
                 ForEach(MainEnum.allCases, id: \.self) x in
                 Text("\(x.name)").tag(Int(x.rawValue))
                 
                    
    if pickMain == 0 
       Picker(selection: $pickA, label: Text("Pick \(pickA)")) 
                  ForEach(AEnum.allCases, id: \.self) x in
                  Text("\(x.name)").tag(Int(x.rawValue))
                  
             
        else if pickMain == 1 
       Picker(selection: $pickB, label: Text("Pick \(pickB)")) 
                  ForEach(BEnum.allCases, id: \.self) x in
                  Text("\(x.name)").tag(Int(x.rawValue))
                  
             
        else if pickMain == 2 
       Picker(selection: $pickC, label: Text("Pick \(pickC)")) 
                  ForEach(CEnum.allCases, id: \.self) x in
                  Text("\(x.name)").tag(Int(x.rawValue))
                  
            
      
     
    
   
  
 

我希望选择 Main,然后第二个选择器将向我显示选择的内容,就好像我会选择一个汽车制造商,然后在第二个选择器中显示相应的汽车型号。

【问题讨论】:

【参考方案1】:

在 beta 5 中,ForEach 存在一个已知问题。来自发行说明:

在闭包中使用带有复杂表达式的 ForEach 视图可以 导致编译器错误。解决方法:将这些表达式提取到 他们自己的视图类型。 (53325810)

您的 ForEach 视图似乎并不太复杂,封装其内容并不能解决问题。但是,如果您封装整个选择器工作正常。仔细检查代码,因为我可能在封装时引入了拼写错误。

import SwiftUI

struct ContentView: View 
    var body: some View 
        EnumsInEnums()
    


struct EnumsInEnums: View 
    @State  var pickMain = 0
    @State  var pickA = 0
    @State  var pickB = 0
    @State  var pickC = 0

    enum MainEnum :  Int16, Hashable, CaseIterable
    
        case AEnum
        case BEnum
        case CEnum
        var name: String  return "\(self)" 
    
    enum AEnum :  Int16, Hashable, CaseIterable
    
        case Aa
        case Ba
        case Ca
        var name: String  return "\(self)" 
    
    enum BEnum :  Int16, Hashable, CaseIterable
    
        case Ab
        case Bb
        case Cb
        var name: String  return "\(self)" 
    
    enum CEnum :  Int16, Hashable, CaseIterable
    
        case Ac
        case Bc
        case Cc
        var name: String  return "\(self)" 
    

    var body: some View 
        NavigationView 
            Form 
                Section 

                    PickerMain(pickMain: $pickMain)

                    if pickMain == 0 
                        PickerA(pickA: $pickA)
                    
                    else if pickMain == 1 
                        PickerB(pickB: $pickB)
                     else if pickMain == 2 
                        PickerC(pickC: $pickC)

                    
                
            
        
    

    struct PickerMain: View 
        @Binding var pickMain: Int

        var body: some View 
            Picker(selection: $pickMain, label: Text("Pick \(pickMain)")) 
                ForEach(MainEnum.allCases, id: \.self) x in
                    Text("\(x.name)").tag(Int(x.rawValue))
                
            
        
    

    struct PickerA: View 
        @Binding var pickA: Int

        var body: some View 
            Picker(selection: $pickA, label: Text("Pick \(pickA)")) 
                ForEach(AEnum.allCases, id: \.self) x in
                    Text("\(x.name)").tag(Int(x.rawValue))
                
            
        
    

    struct PickerB: View 
        @Binding var pickB: Int

        var body: some View 
            Picker(selection: $pickB, label: Text("Pick \(pickB)")) 
                ForEach(BEnum.allCases, id: \.self) x in
                    Text("\(x.name)").tag(Int(x.rawValue))
                
            
        
    

    struct PickerC: View 
        @Binding var pickC: Int

        var body: some View 
            Picker(selection: $pickC, label: Text("Pick \(pickC)")) 
                ForEach(CEnum.allCases, id: \.self) x in
                    Text("\(x.name)").tag(Int(x.rawValue))
                
            
        
    

【讨论】:

以上是关于使用 SwiftUI 选择器,我的 MacBook 加热到 50 度的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 颜色选择器 - ***大小

来自先前选择器的选择器值 - CoreData/SwiftUI

macOS 上的 SwiftUI 选择器

如何在swiftui中使用选择器更改文本大小

无法使用 SwiftUI 使选取器居中

swiftUI 中的选取器正在从 Firestore 中选择文档 ID 而不是文档字段