SwiftUI: как перейти на другой экран после аутентификации с помощью Face/Touch ID

В очень простом приложении с использованием 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)
    }
}

0 ответов

Другие вопросы по тегам