Использование Bool In Struct в SwiftUI - PullRequest
0 голосов
/ 29 мая 2020

У меня проблема при попытке использовать bool как часть быстрой структуры.

struct MapPrefs: Identifiable {
    var id = UUID()
    var name: String
    var isShown: Bool

}

Массив этих prefs предоставляется хранилищем для представления swift-UI

class MapPrefsStore : ObservableObject {

    var willChange = PassthroughSubject<Void, Never>()

    @Published var MapPrefs: [MapPrefs] {
        didSet { willChange.send(()) }
    }

    init(mapPrefs: [MapPrefs]) {
        self.MapPrefs = mapPrefs
    }

}

Представление настроек наблюдает за магазином и передает массив в представление ячеек

struct SettingsView: View {


    @ObservedObject var mapPrefsStore = MapPrefsStore(mapPrefs: MapPrefsTestData)


    var body: some View {

        NavigationView {
            List {

                 Section(header: Text("Map Preferences"), footer: Text("")) {

                    ForEach(mapPrefsStore.MapPrefs) { mapPrefs in
                        MapPrefsCell(mapPrefs: mapPrefs)
                    }
                    .onMove(perform: moveMap)
                                }
                .background(Color.clear)
            }
            .navigationBarTitle(Text("Settings"))
            .navigationBarItems(trailing: EditButton())
            .listStyle(GroupedListStyle())
        }
    }
    func moveMap(from source: IndexSet, to destination: Int) {
        guard let sourceIndex = Array(source).first else { return }
        mapPrefsStore.MapPrefs.insert(mapPrefsStore.MapPrefs.remove(at: sourceIndex), at: destination)
    }
}

struct MapPrefsCell : View {
    let mapPrefs: MapPrefs

    var body: some View {

        Toggle(isOn: mapPrefs.isShown) {
            Text(mapPrefs.name)
        }
    }
}
}

это дает мне следующую ошибку:

Cannot convert value of type 'Bool' to expected argument type 'Binding<Bool>'

Я могу Я не понимаю, как предоставить вызываемой функции (MapPrefsCell) возможность доступа к свойству isShown. Пробовал разные комбинации добавления знака $.

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

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

Вот что я сделал так что другие могут получить выгоду.

import SwiftUI
import Combine

class MapPrefs: Identifiable, ObservableObject {

    var willChange = PassthroughSubject<Void, Never>()

    var id = UUID()
    @Published var name: String = "" {didSet { willChange.send(()) }}
    @Published var isShown: Bool = false  {didSet { willChange.send(()) }}

    init (name: String , isShown: Bool) {
        //self.id = UUID()
        self.name = name
        self.isShown = isShown
    }
}

Затем при создании представления я могу получить доступ к свойству, и переключатель работает

struct MapPrefsCell : View {
    @ObservedObject var mapPrefs: MapPrefs

    var body: some View {

        Toggle(isOn: $mapPrefs.isShown ) {
            Text(mapPrefs.name)
        }
    }
}
0 голосов
/ 29 мая 2020

isShown объявлен как Bool. Передача с $ не сработает, так как вы не можете преобразовать его в Binding<Bool>.

Вы можете объявить его как @State в своей структуре:

struct MapPrefs: Identifiable {
    var id = UUID()
    var name: String
    @State var isShown: Bool

}

, а затем передать его как Binding ...

Toggle(isOn: mapPrefs.$isShown) {
    Text(mapPrefs.name)
}

Изменить:

Вы также можете создать собственное состояние и использовать значение вашего mapPrefs для этого состояния. Но тогда вам нужно будет впоследствии сохранить изменения в своем объекте. В этом случае не нужно объявлять его как @State

struct MapPrefs: Identifiable {
    var id = UUID()
    var name: String
    var isShown: Bool

}

struct MapPrefsCell : View {
    let mapPrefs: MapPrefs

    @State var toggle : Bool

    init(mapPrefs: MapPrefs)
    {
        //create State with initial value here 
        self._toggle = State(initialValue: self.mapPrefs.isShown)
    }

    var body: some View {

        Toggle(isOn: $toggle) {
            Text(mapPrefs.name)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...