0

我有一个具有三个属性 的类topicnavBarHidden并且viewModel我需要使用该类的属性之一来初始化视图模型topic。但我不需要初始化其他属性,```topic. 我必须初始化视图模型,因为它会进行必要的 API 调用。

这是代码片段。

struct TopicCell: View {
    @Binding var navBarHidden : Bool?
    @State var topic: Topic?
    @ObservedObject var viewModel : TopicCellViewModel
    
    init() {
        self.viewModel = TopicCellViewModel(topic: self.topic!)
    }
    
}

起初并不是可选的topicnavBarHidden但后来我不得不初始化它们,我不想这样做。所有将初始化它们的数据都需要传入。所以我将它们设为可选项,这样我就不必初始化它们,然后我只需强制解开可选项。

但这给了我一个问题。

NavigationLink( 
destination: DebateChatView(navBarHidden: $navBarHidden, topic: $topic, subtopic:
 .constant(SubTopic(dictionary: ["id": "", "topic": "Random Subtopic", "title": topic!.title, 
"bool": false , "messages": MOCK_MESSAGEZ])))

请注意两个绑定变量 oftopicnavBarHidden。这些现在不起作用,因为 DebateChatView 期望绑定普通数据,而不是绑定选项。但$topic!不起作用。那么,有人可以告诉我解决此问题的最佳方法吗?

4

1 回答 1

1

正如您所说,值将在父级传递时确定,您可以initialise将视图作为目标来接受这些parameters值并简单地分配值。

import SwiftUI

struct TopicCell: View {
    @Binding var navBarHidden : Bool
    @State var topic: Topic
    @ObservedObject var viewModel : TopicCellViewModel
    
    init(topic:Topic,barHidden:Binding<Bool>) {
        _navBarHidden = barHidden
        _topic = State(wrappedValue: topic)
        self.viewModel = TopicCellViewModel(topic:topic)
    }
    
    var body: some View{
        NavigationView{
            ForEach(0..<5) { index in
               
                    // Some stuff
               
            }
        }
    }
}

struct CellView:View {
    @State var isBarHidden = false
    
    var body: some View{
        TopicCell(topic: Topic(name: "someName"), barHidden: $isBarHidden)
    }
}

struct Topic{
    var name:String
}

class TopicCellViewModel:ObservableObject{
    var topic:Topic
    
    init(topic:Topic) {
        self.topic = topic
    }
}
于 2021-02-27T07:50:40.150 回答