Есть ли способ загрузить функцию с помощью навигационной ссылки в Swift? - PullRequest
1 голос
/ 22 апреля 2020

Я хотел бы знать, есть ли способ вызвать функцию вместе с NavigationLink в Swift. У меня есть подробный вид списка сообщений, но для того, чтобы получить всю информацию для этого подробного просмотра постов, мне нужно вызвать функцию сборщика, чтобы загрузить кучу дополнительной информации, которую я не могу сделать при первоначальном вызове, так как в значительной степени увеличит время, чтобы сделать первоначальный запрос на должности. Что-то вроде следующего, имейте в виду, что это определенно не так, как это будет выглядеть, как я представляю, как это будет работать.

List(self.posts) { result in
   NavigationLink(call: PostFetchingFunction(PostID: result.ID) -> destination: DetailedPostView(post: PostFetchingFunction.result)) {
       Text("Go to detailed post view")
   }
}

Как я уже сказал, это, безусловно, не правильно Swift код, но может быть полезна только визуализация кода того, что я хотел бы сделать.

1 Ответ

1 голос
/ 22 апреля 2020

Этого можно добиться, используя шаблон поставщика, соответствующий ObservableObject

1. ContentView

struct ContentView: View {
    var body: some View {
        NavigationView {
            List(0...100, id: \.self) { (index) in
                NavigationLink("Show \(index)",
                    destination: NextView(provider: ItemProvider(id: index)))
            }
            .navigationBarTitle("List")
        }
    }
}
  • Назначение NextView
  • NextView требует что-то типа ItemProvider для его инициализации (мы увидим это позже)

2. NextView

struct NextView: View {
    @ObservedObject var provider: ItemProvider

    var body: some View {
        Text(provider.title)
            .navigationBarTitle("Item", displayMode: .inline)
            .onAppear {
                self.provider.load()
        }
    }
}
  • ItemProvider - это @ObservedObject, который делает его прослушивателем изменений для обновления представления
  • .onAppear - это место, где мы запускаем функцию, в этом случае self.provider.load(), чтобы получить provider для начала извлечения

3. ItemProvider

class ItemProvider: ObservableObject {
    private var id: Int
    @Published var title: String = ""

    init(id: Int) {
        self.id = id
    }

    func load() {
        title = "Loading \(id)"

        DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in
            guard let _weakSelf = self else { return }
            _weakSelf.title = "Loaded \(_weakSelf.id)"
        }
    }
}
  • ItemProvider должен соответствовать ObservableObject, чтобы выдавать изменения
  • Любые переменные внутри, отмеченные @Published, будут выдавать сигнал изменения
  • ItemProvider имеет функцию load, которая фактически выполняет выборку, и если она обновляет какие-либо @Published переменные, подключенные View s будут уведомлены и обновятся автоматически
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...