SwiftUI: после аутентификации по идентификатору лица / касания, как перейти на другой экран - PullRequest
0 голосов
/ 08 ноября 2019

В очень простом приложении, использующем SwiftUI, у меня есть два представления: HomeView и DetailView.

  1. HomeView - это List с элементами типа Item. Этот тип имеет свойство с именем isLocked.
  2. DetailView - это простое представление, отображающее имя выбранного элемента.
  3. Biomerty - это оболочка для LAContext, которая вызываетоценка биометрии и возвращает результат в виде простого Result<Bool, Error> типа.

Как перейти к DetailView для элементов, у которых для свойства isLocked установлено значение true, только после успешной аутентификации с помощью Face / Touch ID?

// Item

struct Item
{
    name: String
    isLocked: Bool
}
// Row

struct Row: View
{
    @Binding var item: Item

    var body: some View
    {
        HStack
        {
            Image(systemName: "lock.fill")
            Text($item.name)
        }
    }
}
// HomeView

struct HomeView: View
{
    @State private var items: [Item] = [
        Item(name: "Item A", isLocked: false),
        Item(name: "Item B", isLocked: true)
    ]

    var body: some View
    {
        NavigationView
        {
            List(items, id: \.self)
            {
                if !item.isLocked
                {
                    NavigationLink(destination: DetailView(item: $item))
                    {
                        Row(item: $item)
                    }
                }
                else
                {
                    Row(item: $item)
                    .onTapGesture
                    {
                        Biometry.authenticate
                        { result in
                            if case.failure = result
                            {

                            }
                            else
                            {
                                // We endup here, because the Face/Touch ID
                                // authentication was successful. Therefore,
                                // it is here that I would like to
                                // navigate to the detail screen.
                            }
                        }
                    }
                }
            }
        }
    }
}
// DetailView

struct DetailView: View
{
    @Binding var item: Item

    var body: some View
    {
        Text($item.name)
    }
}
...