Попытка использовать мой UIViewController из UIkit в SwiftUI приводит к тому, что протокол не подтверждается представимым - PullRequest
0 голосов
/ 13 июля 2020

Я изучаю и создаю простое приложение с графическим API-интерфейсом metal, и я пытаюсь сделать свой контроллер представления из UIKit display в SwiftUI. Я попытался сделать UIViewControllerRepresentable из моего класса ViewController, но это продолжает приводить к ошибке типа «UIViewController» не соответствует протоколу «UIViewControllerRepresentable». Скорее всего, это связано с тем, что мой ViewController теперь выдает ошибку наследования от непротокольного, неклассового типа «UIViewController», поэтому у него нет протокола. Итак, как мне заставить ViewController, который содержит весь мой металлический код, принять протокол, который нужен представителю?

вот мой код:

//ContentView.swift
import SwiftUI

struct ContentView: View {
  var body: some View {
    UIViewController()
  } 
}

struct ContentView_Previews: PreviewProvider {
   static var previews: some View {
     ContentView()
   }
}

//UIViewController.swift
import SwiftUI
import UIKit

struct UIViewController: UIViewControllerRepresentable { //error: Type 'UIViewController' does not conform to protocol 'UIViewControllerRepresentable'
   func makeUIViewController(context: Context) -> ViewController{
      return ViewController()
   }
}

struct UIViewController_Previews: PreviewProvider {
  static var previews: some View {
      UIViewController()
  }
}

//ViewController.swift
import UIKit
import Metal

class ViewController: UIViewController { //error: Inheritance from non-protocol, non-class type 'UIViewController'
  var device: MTLDevice!
  var metalLayer: CAMetalLayer!

//created is the buffer to send the points over to gpu
var vertexBuffer: MTLBuffer!

//starts the render pipeline
var pipelineState: MTLRenderPipelineState!

//command queue
var commandQueue: MTLCommandQueue!

//timer to render the screen frame by frame
var timer: CADisplayLink!

//insuring the view is loaded so the device can actually be used
override func viewDidLoad() { //error: Method does not override any method from its superclass
  super.viewDidLoad()
    
  device = MTLCreateSystemDefaultDevice()
    
  metalLayer = CAMetalLayer()
  metalLayer.device = device
  metalLayer.pixelFormat = .bgra8Unorm
  metalLayer.framebufferOnly = true
  metalLayer.frame = view.layer.frame
  view.layer.addSublayer(metalLayer) //error: Use of unresolved identifier 'view'
  ....

В ViewController не было ошибок, пока я не попробовал чтобы отобразить его в моем SwiftUI.

Извините за то, что я полный новичок в IOS разработке и графике, но заранее спасибо за вашу помощь.

1 Ответ

0 голосов
/ 13 июля 2020

Для ошибки

Тип 'UIViewController' не соответствует протоколу 'UIViewControllerRepresentable'

Я думаю, вам не хватает метода updateUIViewController из протокола UIViewControllerRepresentable

Кроме того, вызов вашей структуры UIViewController может вызвать конфликт имен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...