-2

I have a storyboard named UploadViewV2 Scene containing a UIView 'Progress Bar' that has been connected to my swift file as an IBOutlet named 'ProgressBarView'. How do I host the SwiftUI code within the 'Progress Bar' UIView? When I use the suggested way of UIHostingController I am getting an error in my main.m file that says "Thread 1: "[<DWTools.CMWSTUploadViewV2Controller 0x12be24e50> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key ProgressBar." I am trying to use the information given from MikeLee in this post

enter image description here enter image description here enter image description here

   import Foundation
//import UIKit
import SwiftUI

@objc public protocol CMWUploadViewV2Delegate: NSObjectProtocol {
    @objc func uploadOKButtonPushed()
    @objc func uploadAbortButtonPushed()
    @objc func uploadErrorLogButtonPushed()
    @objc func uploadRetryButtonPushed()
}

//does class scope need to be broadened to all of code?
@objc class CMWSTUploadViewV2Controller: UIViewController {
  
    @IBOutlet var ProgressBarView: UIView!
    
    // embed SwiftUI into the UIKit storyboard view controller
    override func viewDidLoad() {
            super.viewDidLoad()

            let childView = UIHostingController(rootView:ContentView())
            addChild(childView)
            childView.view.frame = ProgressBarView.bounds
        ProgressBarView.addSubview(childView.view)
            childView.didMove(toParent: self)
        }

        
    
    @objc weak var delegate: CMWUploadViewV2Delegate?
    
}
    struct ContentView: View {
        @State var progressValue: Float = 0.3
        let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
        @State private var degress: Double = -110
        
        //mine
        let label = UILabel()
        
        
        var body: some View {
            
            VStack {
                Spacer()
                Spacer()
                Label("Resetting to upload mode.", systemImage: "clock")
                    .font(.title)
                    .foregroundColor(Color(hex: "000"))
                ZStack{
                    RoundedRectangle(cornerRadius: 25)
                        .fill(Color(hex: "494949"))
                        .frame(width: 300, height: 300)
                    
                    ProgressBar(progress: self.$progressValue)
                        .frame(width: 250.0, height: 250.0)
                        .padding(40.0).onReceive(timer) { _ in
                            withAnimation {
                                if progressValue < 0.8999996 {
                                    progressValue += 0.0275
                                }
                            }
                        }
                    
                    ProgressBarTriangle(progress: self.$progressValue).frame(width: 280.0, height: 290.0).rotationEffect(.degrees(degress), anchor: .bottom)
                        .offset(x: 0, y: -150).onReceive(timer) { input in
                            withAnimation(.linear(duration: 0.01).speed(200)) {
                                if degress < 110.0 {
                                    degress += 10
                                }
                                print(degress)
                            }
                        }
                }
                
                
                //***Label2
                
                VStack(alignment :.leading) {
                    Label("Controller type: 60PJTV4", image: "ControllerIcon")
                        .foregroundColor(Color(hex: "000"))
                    Label("Connection type: CAN", image: "CANIconSmall")
                        .foregroundColor(Color(hex: "000"))
                    Label("Status:", image: "StatusIcon")
                        .foregroundColor(Color(hex: "000"))
                    Label("Controller Responding This needs to be 4 lines.", image: "")
                        .foregroundColor(Color(hex: "000"))
                    
                    
                    
                    Spacer()
                }
            }
        }
        
        struct ProgressBar: View {
            @Binding var progress: Float
            
            var body: some View {
                VStack{
                    Label("Address: 0x1c000", systemImage: "target")
                        .foregroundColor(Color(hex: "8f8f8f"))
                ZStack {
                    
                    Circle()
                        .trim(from: 0.35, to: 0.85)
                        .stroke(style: StrokeStyle(lineWidth: 12.0, lineCap: .round, lineJoin: .round))
                        .opacity(0.3)
                        .foregroundColor(Color.gray)
                        .rotationEffect(.degrees(54.5))
                    
                    Circle()
                        .trim(from: 0.35, to: CGFloat(self.progress))
                        .stroke(style: StrokeStyle(lineWidth: 12.0, lineCap: .round, lineJoin: .round))
                        .fill(AngularGradient(gradient: Gradient(stops: [
                            .init(color: Color.init(hex: "daff00"), location: 0.39000002),
                            //.init(color: Color.init(hex: "E59148"), location: 0.48000002),
                            .init(color: Color.init(hex: "00ff04"), location: 0.5999999),
                            //.init(color: Color.init(hex: "EEED56"), location: 0.7199998),
                            .init(color: Color.init(hex: "32E1A0"), location: 0.8099997)]), center: .center))
                        .rotationEffect(.degrees(54.5))
                    
                    VStack{
                        
                        
                        Text("824").font(Font.system(size: 44)).bold().foregroundColor(Color.init(hex: "ffffff"))
                        //Text("Please standby...").bold().foregroundColor(Color.init(hex: "FF6600"))
                        
                        Label("Please standby...", systemImage: "clock")
                            .foregroundColor(Color(hex: "FF6600"))
                        Label("Uploading memory model to controller", systemImage: "")
                            .foregroundColor(Color(hex: "8f8f8f"))
                        
                    }
                    }
                    
                }
                
            }
            
        }
        
        
        struct ProgressBarTriangle: View {
            @Binding var progress: Float
            
            
            var body: some View {
                ZStack {
                    Image("triangle").resizable().frame(width: 10, height: 10, alignment: .center)
                }
            }
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    
    extension Color {
        init(hex: String) {
            let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
            var int: UInt64 = 0
            Scanner(string: hex).scanHexInt64(&int)
            let a, r, g, b: UInt64
            switch hex.count {
            case 3: // RGB (12-bit)
                (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
            case 6: // RGB (24-bit)
                (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
            case 8: // ARGB (32-bit)
                (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
            default:
                (a, r, g, b) = (1, 1, 1, 0)
            }
            
            self.init(
                .sRGB,
                red: Double(r) / 255,
                green: Double(g) / 255,
                blue:  Double(b) / 255,
                opacity: Double(a) / 255
            )
        }
        
    }
    
Summer
  • 69
  • 7
  • SwiftUI does not use UIView, UIViewController, or storyboard. – matt Aug 11 '23 at 11:03
  • @matt How could I make this work if I do not use SwiftUI? I need it to use UIView, UIViewController and the storyboard. – Summer Aug 13 '23 at 20:03
  • I'm saying your code is SwiftUI code. So your question about UIView and storyboard makes no sense. UIView is UIKit, not SwiftUI; storyboard is UIKit, not SwiftUI. SwiftUI and storyboard do not go together; they are opposites. You should have started with a Storyboard app. You started with a SwiftUI app. – matt Aug 13 '23 at 21:07
  • @matt would it be possible to use something such as UIHostingController, or UIViewRepresentable? – Summer Aug 13 '23 at 23:53
  • To use it for what? Your progress bar and label code is SwiftUI code. Are you trying to host SwiftUI code inside a UIKit app? You can certainly do that. – matt Aug 14 '23 at 00:42
  • @matt Yes, I would like to host the SwiftUI progress bar within the UIView that is shown in the storyboard named 'Progress Bar' so that when the app is running the user can see the SwiftUI progress bar I have created. – Summer Aug 14 '23 at 03:07

1 Answers1

0

The error "this class is not key value coding-compliant for the key ..." was solved by going to the storyboard then connection inspector and deleting an old outlet that had been deleted from the swift file earlier and was not needed. The following is what ended up working to host the SwiftUI code within the UIView:

override func viewDidLoad() {
            super.viewDidLoad()

            let childView = UIHostingController(rootView:ContentView())
            addChild(childView)
            childView.view.frame = ProgressBarView.bounds
        ProgressBarView.addSubview(childView.view)
            childView.didMove(toParent: self)
        }
Summer
  • 69
  • 7