我有一個自定義結構,其中包含一個文本欄位,以及一個與文本欄位關聯的狀態變數。每次我只是嘗試驗證文本欄位時,狀態變數都是空的,即使文本欄位內有輸入。有什么我想念的嗎?
這是在我的注冊課程中:
//
// Signup.swift
// Lazuli Social
//
// Created by user207789 on 12/28/21.
//
import SwiftUI
struct Signup: View
{
//If Everything Is Valid
@State var isValid: Bool = false;
init()
{
}
var body: some View
{
NavigationView
{
GeometryReader
{
metrics in
VStack (alignment: .center)
{
//First Name
var first:EnhancedTextField =
EnhancedTextField(hintIn:"First name", widthIn:
metrics.size.width,
heightIn:metrics.size.height,typeIn:0);
//Displays First
first;
Button(
action:
{
if(first.checkErrors()==true)//THE INPUT IS BLANK HERE, EVEN WITH INPUT TEXT
{
//There Was Some Error
isValid=false;
}
else
{
//No Error
isValid=true;
}
}
,label:
{
Text("")
})
//Next Button
NavigationLink(destination: AccountInfo(),isActive:
.constant(isValid==true))
{
}
.navigationBarHidden(true)
.navigationBarTitle("")
.disabled(isValid==false)
}
}
}
.navigationBarHidden(true)
.navigationBarTitle("")}
}
這是我的自定義結構,其中包含文本欄位:
//
// EnhancedTextField.swift
// Lazuli Social
//
// Created by user207789 on 12/29/21.
//
import SwiftUI
struct EnhancedTextField: View
{
@State var hint: String;
//First Name Input
@State public var text: String = "" //THIS IS NULL, EVEN WHEN THERE IS INPUT
//If First Name Focus Is Changed
@FocusState public var isFocused: Bool
//StringDetector Class
var detector: StringDetector
public func checkErrors() -> Bool
{
if(type==0)
{
let result = checkErrorsFirstName();
return result;
}
else
{
return true;
}
}
public func checkErrorsFirstName() -> Bool
{
//StrignDetector Result
let result = detector.checkErrorsFirstName(first:self.text);//THIS IS WHERE I'M TRYING TO PASS THE INPUT OF TEXTFIELD TO AN INTERNAL CLASS FOR STRING VALIDATION, HOWEVER IT IS ALWAYS EMPTYM EVEN WITH INPUT
//Error Text
errorText=result.1;
//Bordrer Color
borderColor=result.2;
//Icon String
iconName=result.3;
//Icon Color
iconColor=result.4;
//There Is An Validation Error
if(result.0==true)
{
return true;
}
else
{
return false;
}
}
var body: some View
{
VStack (alignment: .center)
{
//First Name Input
TextField(hint, text: $text)
.padding(.bottom, height*Alpha.tAlpha)
.padding(.top, height*Alpha.tAlpha)
.frame(maxWidth: .infinity, alignment: .center)
.focused($isFocused)
.textInputAutocapitalization(.never)
.disableAutocorrection(true)
.onChange(of:isFocused)
{
newValue in
if (newValue==false)
{
//Check Validation Errors
checkErrors();
}
.padding(.horizontal, width*0.10)
}
}
}
謝謝,
以賽亞湯普森
uj5u.com熱心網友回復:
這是您的代碼的一個非常簡化的版本,顯示父級擁有的狀態。有效性只是測驗文本是否為空(僅用于演示目的)。
func checkErrors(input: String) -> Bool {
return !input.isEmpty
}
struct Signup: View
{
@State private var text : String = ""
@State private var isValid : Bool = false
var body: some View
{
EnhancedTextField(hint: "Hint", text: $text)
.border(isValid ? .clear : .red)
Button(action: {
isValid = checkErrors(input: text)
}) {
Text("Test")
}
}
}
struct EnhancedTextField: View
{
@State var hint: String
@Binding var text: String
@FocusState private var isFocused: Bool
@State private var hasErrors = false
var body: some View
{
VStack (alignment: .center)
{
//First Name Input
TextField(hint, text: $text)
.frame(maxWidth: .infinity, alignment: .center)
.focused($isFocused)
.textInputAutocapitalization(.never)
.disableAutocorrection(true)
.onChange(of:isFocused)
{ newValue in
if !newValue
{
//Check Validation Errors
hasErrors = checkErrors(input: text)
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/405062.html
標籤:
