#swift #xcode #swiftui #swift-protocols #contentview
#swift #xcode #swiftui #swift-протоколы #contentview
Вопрос:
Я попытался реализовать функцию,,Face ID» для моего приложения в contentView (Swift UI), но после этого я получаю эту ошибку — «Тип ‘contentView’ не соответствует протоколу ‘View'». Когда я попытался исправить ошибку, она предложила решение: typealias Body = <#type#>
но я не знаю, что туда добавить. Возможно, я просто неправильно внедрил идентификатор лица, поэтому вот исходный код результата и тот, который был до реализации.
После:
import SwiftUI
import LocalAuthentication
struct ContentView : View {
@State private var isUnlocked = false
@ObservedObject var service: DataService = .shared
var categories:[String:[Goal]] {
.init(
grouping: service.goals,
by: {$0.category.rawValue}
)
}
func authenticate() {
let context = LAContext()
var error: NSError?
// check whether biometric authentication is possible
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: amp;error) {
// it's possible, so go ahead and use it
let reason = "We need to unlock your data."
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { success, authenticationError in
// authentication has now completed
DispatchQueue.main.async {
if success {
self.isUnlocked = true
} else {
// there was a problem
}
}
var body: some View {
VStack {
if self.isUnlocked {
NavigationView{
List (categories.keys.sorted(), id:.self) {key in
GoalRow(categoryName: "Level (key)".uppercased(), goals: self.categories[key]!)
.frame(height: 320)
.padding(.top)
.padding(.bottom)
}
.navigationBarTitle(Text("Future"))
}
} else {
Text("Locked")
}
}
.onAppear(perform: authenticate)
}
}
#if DEBUG
struct Content_Previews : PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
}
}
}
Перед:
import SwiftUI
struct ContentView : View {
@ObservedObject var service: DataService = .shared
var categories:[String:[Goal]] {
.init(
grouping: service.goals,
by: { $0.category.rawValue }
)
}
var body: some View {
NavigationView{
List (categories.keys.sorted(), id:.self) {key in
GoalRow(categoryName: "Level (key)".uppercased(), goals: self.categories[key]!)
.frame(height: 320)
.padding(.top)
.padding(.bottom)
}
.navigationBarTitle(Text("Future"))
}
}
}
#if DEBUG
struct Content_Previews : PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
Ответ №1:
Сначала выберите весь код и нажмите cmd i
для отступа кода. И в коде вы закрыли 3 фигурные скобки в конце кода, что неверно. Добавьте эти 3 фигурные скобки для функции аутентификации.
struct ContentView : View {
@State private var isUnlocked = false
@ObservedObject var service: DataService = .shared
var categories:[String:[Goal]] {
.init(
grouping: service.goals,
by: {$0.category.rawValue}
)
}
func authenticate() {
let context = LAContext()
var error: NSError?
// check whether biometric authentication is possible
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: amp;error) {
// it's possible, so go ahead and use it
let reason = "We need to unlock your data."
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { success, authenticationError in
// authentication has now completed
DispatchQueue.main.async {
if success {
self.isUnlocked = true
} else {
// there was a problem
}
}
}
}
}
//Your body view
}
#if DEBUG
struct Content_Previews : PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
Комментарии:
1. Спасибо, приятель! Работает так, как я хотел сейчас