SwiftUI: Как передать основные объекты данных в представления? - PullRequest
2 голосов
/ 11 октября 2019

Что я хочу сделать: передать ссылку на NSManagedObject объекта FetchRequest (здесь: из TestView) в другое дочернее представление (здесь: LogRectangle).

То, что я пробовал: Это в основном важные строки :

List(testObjects, id: \.self) { habit in
    LogRectangle(testObject: testObject)
}

И это весь код:

struct TestView : View {
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(
        entity: TestObject.entity(),
        sortDescriptors: [NSSortDescriptor(keyPath: \TestObject.name, ascending: true)]
    ) var testObjects: FetchedResults<TestObject>


    var body: some View {
        NavigationView {
            HStack {
                Button(action: {
                    let testObject = TestObject(context: self.managedObjectContext)
                    habit.name = "TestObject String"
                    do {
                        try self.managedObjectContext.save()
                    } catch {
                        // handle the Core Data error
                    }
                }) {
                    Text("Insert example TestObject")
                }
                List(testObjects, id: \.self) { habit in
                    LogRectangle(testObject: testObject)
                }
            }
                .navigationBarTitle("Test")
        }
    }
}

struct LogRectangle : View {
    var habit : TestObject

    var body: some View {
        Text(habit.name)
            .font(.title)
            .foregroundColor(.white)        
    }
}

Здесь я получаю эту ошибкуна строке с текстом в классе LogRectangle.

Cannot convert value of type 'String?' to expected argument type 'LocalizedStringKey'

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Вы столкнулись с этой ошибкой, возможно, потому, что атрибут name определен как необязательная строка в модели данных.

Структура Text не принимает необязательное значение. Это должно быть явное значение:

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

Parameters for Text struct

Поэтому вам нужно будет внести некоторые изменения в модель, которую вы передаете в LogRectangle. Эти изменения могут быть сделаны либо на уровне модели данных (и затем обновлять связанный класс NSManagedObject, либо у вас может быть вычисленное свойство в модели для предоставления необязательного значения атрибута.

0 голосов
/ 11 октября 2019

Возможно, вам повезет больше, если использовать индексы testObject для списка, а не итерировать реальные объекты. Попробуйте это:

List(testObjects.indices, id: \.self) { index in
     LogRectangle(testObject: testObjects[index])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...