В очень простом приложении, использующем SwiftUI, у меня есть два представления: HomeView
и DetailView
.
HomeView
- это List
с элементами типа Item
. Этот тип имеет свойство с именем isLocked
. DetailView
- это простое представление, отображающее имя выбранного элемента. 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)
}
}