I have a class with three properties, topic, navBarHidden and viewModel and I need to initialize the viewmodel with one of the class's properties, topic.
But I don't need to initialize the other properties, ```topic. I have to initialize the view model because it makes a necessary API call.
Here's a snippet of the code.
struct TopicCell: View {
@Binding var navBarHidden : Bool?
@State var topic: Topic?
@ObservedObject var viewModel : TopicCellViewModel
init() {
self.viewModel = TopicCellViewModel(topic: self.topic!)
}
}
At first topic and navBarHidden weren't optionals, but then I'd have to initialize them, which I don't want to do. All the data that will initialize them needs to be passed in. So I made them optionals, which makes me not have to initialize them, then I just force unwrap the optionals.
But this gives me one issue.
NavigationLink(
destination: DebateChatView(navBarHidden: $navBarHidden, topic: $topic, subtopic:
.constant(SubTopic(dictionary: ["id": "", "topic": "Random Subtopic", "title": topic!.title,
"bool": false , "messages": MOCK_MESSAGEZ])))
Notice the two binding variables, of topic and navBarHidden. These don't work now, because DebateChatView is expecting bound normal data, not bound optionals. But $topic! doesn't work. So, can someone please tell me the best way to fix this issue?
As you said values are to be decided when they are passed by parent, you can initialise target view to accept those parameters and simply assign the values.
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
}
}