Вызов SwiftUI View из UITabBarController - PullRequest
1 голос
/ 26 января 2020

Я постепенно преобразовываю свой проект в SwiftUI. Я хочу подключить свой UITabBarController в раскадровке к представлению SwiftUI.

Насколько я понимаю, лучший способ - использовать UIHostingController. Я добавил один к своей раскадровке, подключил его к TabBar и добавил свой собственный HostingViewController в качестве пользовательского класса для этого контроллера. (Это отображается на вкладке «больше», если это имеет значение, как все)

Я предполагаю, что мне не хватает некоторого кода здесь, но я нахожу в основном фрагменты, не имеющие надлежащего примера. UIHostingController

import Foundation
import UIKit
import SwiftUI

class HseEventHostingVC: UIHostingController<HseView>{

}

Я установил это как класс для моего UIHostingController в раскадровке, который подключен к моей панели вкладок. Когда я пытаюсь запустить, я получаю эту ошибку.

Неустранимая ошибка: init (coder :) должен быть реализован в подклассе и вызывать super.init (coder :, rootView :): file

Я следовал этому простому руководству здесь , это было для толчка SwiftUI View, но решил, что в теории он не слишком отличается.

Вот мой SwiftUI View

import SwiftUI

struct HseView: View {
    var body: some View {
        let first = HSECell(name: "Newest Observation", duedate: "2019/10/10", status: "Open", reportedBy: "Carson Skjerdal", reportedDate: "2020/01/01", hseid: "OBS12")

        let hseItems = [first]

        return List(hseItems) {item in

            HseItemRow(hsecell: item)
        }
    }
}

struct HseView_Previews: PreviewProvider {
    static var previews: some View {
        HseView()
    }
}

struct HseItemRow: View{

    var hsecell: HSECell

    var body: some View{
        VStack{
            HStack(){
                Text("\(hsecell.hseid)")
                Text("\(hsecell.name)")
                    .bold()
            }
            Divider()
            HStack{
                VStack(alignment: .leading){
                    Text("Reported Date: ")
                        .bold()
                    Text("Reported By: ")
                        .bold()
                    Text("Status: ")
                        .bold()
                    Text("Due Date:")
                        .bold()
                }
                VStack(alignment: .leading){

                    Text("\(hsecell.reportedDate)")

                    Text("\(hsecell.reportedBy)")

                    Text("\(hsecell.status)")

                    Text("\(hsecell.duedate)")
                }
            }.padding(.trailing)

        }
    }


}

А также моя идентифицируемая структура HSECell

import Foundation

struct HSECell: Identifiable{

    var id = UUID()
    var name: String
    var duedate: String
    var status: String
    var reportedBy: String
    var reportedDate: String
    var hseid: String 

}

Обновление: я попытался добавить контроллер навигации перед контроллером хостинга, и У меня просто черный экран.

1 Ответ

1 голос
/ 27 января 2020

Это удалось решить, я полагаю, что кому-то еще это понадобится.

Ключ был при определении моего UIHostController, мне пришлось правильно инициализировать его с помощью SwiftUI View

class MyClassNameHostVC: UIHostingController<CustomSwiftUiView>{
    required init?(coder aDecoder: NSCoder){
        super.init(coder: aDecoder, rootView: CustomSwiftUiView())
    }

} 

Помогли решить эту проблему с с этого сайта ..

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