SwiftUIã§ãã€ãã£ãã«æãããã©ãŒã æ€èšŒïŒãã©ãŒã«ã¹ãšãšã©ãŒ
SwiftUIã§ãã€ãã£ãã«æãããã©ãŒã æ€èšŒ: ãã©ãŒã«ã¹ãé©åã«æ±ããé©åãªã¿ã€ãã³ã°ã§ã€ã³ã©ã€ã³ãšã©ãŒã衚瀺ãããµãŒããŒã¡ãã»ãŒãžããŠãŒã¶ãŒã«èç«ãããã«ç€ºãæ¹æ³ã

SwiftUIã§ããã€ãã£ãã«æãããæ€èšŒãã©ãããã¹ãã
ãã€ãã£ãã«æããiOSãã©ãŒã ã¯èœã¡çããŠããŸããã¿ã€ãã³ã°äžã«ãŠãŒã¶ãŒãšå£è«ãããå¿ èŠãªãšãã«æç¢ºãªãã£ãŒãããã¯ãäžããäœãééã£ãŠããããæ¢ãåãããŸããã
äž»èŠãªæåŸ ã¯äºæž¬å¯èœæ§ã§ããåãæäœã¯åžžã«åãçš®é¡ã®ãã£ãŒãããã¯ãããããã¹ãã§ãããã£ãŒã«ããç¡å¹ãªå Žåããã©ãŒã ã¯äžè²«ããå Žæã§ãäžè²«ããããŒã³ã§ãæç¢ºãªæ¬¡ã®ã¹ããããšãšãã«ããã瀺ãã¹ãã§ãã
ã»ãšãã©ã®ãã©ãŒã ã¯äžçš®é¡ã®ã«ãŒã«ãå¿ èŠãšããŸã:
- ãã£ãŒã«ãã«ãŒã«: åäžã®å€ãæå¹ãïŒç©ºã圢åŒãé·ãïŒïŒ
- ã¯ãã¹ãã£ãŒã«ãã«ãŒã«: å€ãäºãã«äžèŽãããäŸåãããïŒãã¹ã¯ãŒããšç¢ºèªãã¹ã¯ãŒãïŒïŒ
- ãµãŒããŒã«ãŒã«: ããã¯ãšã³ãã¯åãå ¥ãããïŒã¡ãŒã«ãæ¢ã«äœ¿ãããŠãããæåŸ ãå¿ èŠïŒïŒ
ã¿ã€ãã³ã°ã¯å·§åŠãªèšãåãããéèŠã§ããè¯ãæ€èšŒã¯æå³ã®ããç¬éãŸã§åŸ ã¡ããã®æã«äžåºŠã ãæç¢ºã«äŒããŸããå®çšçãªãªãºã ã¯æ¬¡ã®ããã«ãªããŸã:
- ãŠãŒã¶ãŒãå ¥åããŠããéã¯éãã«ããŠãããç¹ã«åœ¢åŒãã§ãã¯ã§ã¯ã\n- ãã£ãŒã«ããé¢ããåŸããŸãã¯ãŠãŒã¶ãŒãéä¿¡ãã¿ããããåŸã«ãã£ãŒãããã¯ã衚瀺ããã\n- ãšã©ãŒã¯ä¿®æ£ããããŸã§è¡šç€ºããä¿®æ£ããããããã«æ¶ãã
ãŠãŒã¶ãŒããŸã çãã圢æããŠããéïŒã¡ãŒã«ããã¹ã¯ãŒããå ¥åäžãªã©ïŒã¯æ€èšŒã¯éãã§ããã¹ãã§ããæåã®æåã§ãšã©ãŒã衚瀺ããã®ã¯ãæè¡çã«æ£ãããŠãã€ããŸãšãã®ããã«æããããŸãã
æ€èšŒã¯ãŠãŒã¶ãŒãçµãã£ãããšã瀺ãããšãã«å¯èŠåãããã¹ãã§ã: ãã©ãŒã«ã¹ãé¢ãããšãããŸãã¯éä¿¡ã詊ã¿ããšããããã圌ããã¬ã€ãã³ã¹ãæ±ããç¬éã§ããããã®ãšãã«ã©ã®ãã£ãŒã«ãã«æ³šæãå¿ èŠããæ£ç¢ºã«ç€ºãæå©ããã§ããŸãã
ã¿ã€ãã³ã°ãæ£ããããã°ãä»ã¯ç°¡åã«ãªããŸããã€ã³ã©ã€ã³ã¡ãã»ãŒãžã¯çãä¿ãŠããã©ãŒã«ã¹ç§»åã¯æçã«æãããããµãŒããŒåŽã®ãšã©ãŒã¯çœ°ã§ã¯ãªãéåžžã®ãã£ãŒãããã¯ã«æããããŸãã
ã·ã³ãã«ãªæ€èšŒã¹ããŒãã¢ãã«ãèšå®ãã
ãã€ãã£ãã«æãããã©ãŒã ã¯ããŠãŒã¶ãŒãå ¥åããããã¹ããšã¢ããªã®ãã®ããã¹ãã«å¯ŸããæèŠããããã«åé¢ããããšããå§ãŸããŸããæ··åšããããšããšã©ãŒãæ©ã衚瀺ããããããUIããªãã¬ãã·ã¥ããããšãã«ãµãŒããŒã¡ãã»ãŒãžã倱ã£ããããŸãã
åçŽãªã¢ãããŒãã¯ãåãã£ãŒã«ãã«4ã€ã®èŠçŽ ãæãããããšã§ã: çŸåšã®å€ããŠãŒã¶ãŒããã®ãã£ãŒã«ãã«è§Šãããã©ãããããŒã«ã«ïŒããã€ã¹äžïŒã§ã®ãšã©ãŒããµãŒããŒãšã©ãŒïŒããå ŽåïŒãUI㯠touched ãš submitted ã«åºã¥ããŠäœã衚瀺ããããæ±ºããããæ¯ããŒå
¥åã«åå¿ããå¿
èŠããªããªããŸãã
struct FieldState {
var value: String = ""
var touched: Bool = false
var localError: String? = nil
var serverError: String? = nil
// One source of truth for what the UI displays
func displayedError(submitted: Bool) -> String? {
guard touched || submitted else { return nil }
return localError ?? serverError
}
}
struct FormState {
var submitted: Bool = false
var email = FieldState()
var password = FieldState()
}
ããã€ãã®å°ããªã«ãŒã«ã§äºæž¬å¯èœæ§ãä¿ãŠãŸã:
- ããŒã«ã«ãšã©ãŒãšãµãŒããŒãšã©ãŒã¯åé¢ããŠãããããŒã«ã«ã«ãŒã«ïŒãå¿ é ãããç¡å¹ãªã¡ãŒã«ãïŒããã¡ãŒã«ã¯æ¢ã«äœ¿ãããŠãããã®ãããªãµãŒããŒã¡ãã»ãŒãžãäžæžãããŠã¯ãããŸããã
- ãŠãŒã¶ãŒããã®ãã£ãŒã«ããåç·šéãããšãã«
serverErrorãã¯ãªã¢ããŠãå€ãã¡ãã»ãŒãžãèŠç¶ããããšããªãããã«ããã touched = trueã¯æåã®æåå ¥åæã§ã¯ãªãããŠãŒã¶ãŒããã£ãŒã«ããé¢ãããšãïŒãŸãã¯ã€ã³ã¿ã©ã¯ãããããšãããšå€å®ãããšãïŒã«èšå®ããã
ãããããã°ããã¥ãŒã¯ value ã«èªç±ã«ãã€ã³ãã§ããŸããæ€èšŒã¯ localError ãæŽæ°ããAPI局㯠serverError ãèšå®ããŠäºãã«è¡çªããŸããã
ããã²ãŒããããã©ãŒã«ã¹åŠçïŒè©°ãããªãããã®é æ ®ïŒ
è¯ãSwiftUIã®æ€èšŒã¯ãã·ã¹ãã ããŒããŒãããŠãŒã¶ãŒã®ã¿ã¹ã¯å®äºãå©ããŠããããã«æããããã¹ãã§ãã¢ããªãå±ã£ãŠããããã«èŠããŠã¯ãããŸããããã©ãŒã«ã¹ã¯ãã®å€§ããªèŠçŽ ã§ãã
ã·ã³ãã«ãªãã¿ãŒã³ã¯ã@FocusState ã䜿ã£ãŠãã©ãŒã«ã¹ãåäžã®äºå®ã®æºãšããŠæ±ãããšã§ãããã£ãŒã«ãããšã®enumãå®çŸ©ããããããããã€ã³ãããŠãããŒããŒãã®ãã¿ã³ãã¿ãããããšãã«æ¬¡ã«é²ããŸãã
enum Field: Hashable { case email, password, confirm }
@FocusState private var focused: Field?
TextField("Email", text: $email)
.textContentType(.emailAddress)
.keyboardType(.emailAddress)
.textInputAutocapitalization(.never)
.submitLabel(.next)
.focused($focused, equals: .email)
.onSubmit { focused = .password }
SecureField("Password", text: $password)
.submitLabel(.next)
.focused($focused, equals: .password)
.onSubmit { focused = .confirm }
ãã€ãã£ãã«æããæ±ºãæã¯ç¯åºŠã§ãããã©ãŒã«ã¹ã¯ãŠãŒã¶ãŒã®æç¢ºãªã¢ã¯ã·ã§ã³ïŒNextãDoneãäž»èŠãã¿ã³ã®ã¿ããïŒã«ã®ã¿ç§»åãããŠãã ãããéä¿¡æã«ã¯æåã®ç¡å¹ãªãã£ãŒã«ãã«ãã©ãŒã«ã¹ãç§»ãïŒå¿ èŠãªãã¹ã¯ããŒã«ããŠïŒãå ¥åäžã«å€ãç¡å¹ã ãããšãã£ãŠãã©ãŒã«ã¹ã奪ããªãã§ãã ãããããŒããŒãã®ã©ãã«ã¯äžè²«ããŠäœ¿ãåããŸã: äžéãã£ãŒã«ãã«ã¯ Nextãæçµãã£ãŒã«ãã«ã¯ Doneã
ããããäŸã¯ãµã€ã³ã¢ããã§ãããŠãŒã¶ãŒããCreate Accountããã¿ããããŸããäžåºŠæ€èšŒãè¡ãããšã©ãŒã衚瀺ããŠããæåã«å€±æãããã£ãŒã«ãïŒå€ãã®å Žå EmailïŒã«ãã©ãŒã«ã¹ãç§»ããŸãããããŠãŒã¶ãŒã Password ãå ¥åäžãªããå ¥åéäžã«æ»ããŠã¯ãããŸããããã®å°ããªé æ ®ããæŽç·ŽãããiOSãã©ãŒã ããšãã€ã©ã€ã©ãããã©ãŒã ããåããŸãã
é©åãªã¿ã€ãã³ã°ã§çŸããã€ã³ã©ã€ã³ãšã©ãŒ
ã€ã³ã©ã€ã³ãšã©ãŒã¯å°ããªãã³ãã®ããã«æããããã¹ãã§ãå±è²¬ã®ããã§ã¯ãããŸããããã€ãã£ããšç ©ãããã®æå€§ã®éãã¯ãã¡ãã»ãŒãžã衚瀺ããã¿ã€ãã³ã°ã§ãã
ã¿ã€ãã³ã°ã®ã«ãŒã«
ãŠãŒã¶ãŒãå ¥åãå§ããç¬éã«ãšã©ãŒãåºããšäžæã«ãªããŸããããè¯ãã«ãŒã«ã¯: ãŠãŒã¶ãŒããã®ãã£ãŒã«ããå ¥åãçµããç¶äºãäžããããšã
ã€ã³ã©ã€ã³ãšã©ãŒã衚瀺ããè¯ãç¬é:
- ãã£ãŒã«ãã®ãã©ãŒã«ã¹ãå€ããåŸ
- ãŠãŒã¶ãŒãéä¿¡ãã¿ããããåŸ
- ã¿ã€ãã³ã°äžã«çãééã§æ¢ãŸã£ããšãïŒã¡ãŒã«åœ¢åŒã®æãããªãã§ãã¯ã®ã¿ïŒ
ä¿¡é Œã§ããã¢ãããŒãã¯ããã£ãŒã«ãã touched ã«ãªã£ããéä¿¡ã詊ã¿ããããšãã ãã¡ãã»ãŒãžã衚瀺ããããšã§ããæ°ãããã©ãŒã ã¯éãã«ä¿ãããŸããããŠãŒã¶ãŒãæäœããã°æç¢ºãªã¬ã€ããåŸãããŸãã
ã¬ã€ã¢ãŠããšã¹ã¿ã€ã«
ãšã©ãŒãåºããšãã«ã¬ã€ã¢ãŠããè·³ããã®ã¯iOSããããããŸãããã¡ãã»ãŒãžã®ããã®ã¹ããŒã¹ã確ä¿ãããã衚瀺ãã¢ãã¡ãŒã·ã§ã³ããŠé£ã®ãã£ãŒã«ããæ¥ã«æŒãäžããããªãããã«ããŸãã
ãšã©ãŒæã¯çãå ·äœçã«ã1ã¡ãã»ãŒãžã«ã€ã1ã€ã®ä¿®æ£ã瀺ããŠãã ãããããã¹ã¯ãŒãã¯æäœ8æåå¿ èŠã§ããã¯å®è¡å¯èœã§ããããç¡å¹ãªå ¥åãã¯ããã§ã¯ãããŸããã
ã¹ã¿ã€ã«ã¯æ§ããã§äžè²«æ§ãæãããŸãããã£ãŒã«ãäžã®å°ãããã©ã³ãïŒfootnoteçžåœïŒãäžè²«ãããšã©ãŒã«ã©ãŒããã£ãŒã«ãã®ãããããã€ã©ã€ãã¯ãæ¿ãèæ¯ããèªã¿ãããããšãå€ãã§ããæå¹ã«ãªã£ããã¡ãã»ãŒãžã¯ããã«æ¶ããŸãã
çŸå®çãªäŸ: ãµã€ã³ã¢ãããã©ãŒã ã§ãŠãŒã¶ãŒã name@ ãšå
¥åããŠããéã«ãEmail is invalidããšè¡šç€ºããªãã§ãã ããããã£ãŒã«ããé¢ããåŸããããã¯çãããŒãºã®åŸã«è¡šç€ºããã¢ãã¬ã¹ãæå¹ã«ãªã£ãç¬éã«åãé€ããŸãã
ããŒã«ã«æ€èšŒã®ãããŒ: å ¥åäžããã£ãŒã«ããé¢ãããšããéä¿¡æ
è¯ãããŒã«ã«ãããŒã«ã¯äžã€ã®é床ããããŸã: ã¿ã€ãã³ã°äžã®ãããããã³ãããã£ãŒã«ãé¢è±æã®ããå³å¯ãªãã§ãã¯ãéä¿¡æã®å®å šãªã«ãŒã«ããããæ€èšŒããã€ãã£ãã«æãããããªãºã ã§ãã
å
¥åäžã¯è»œãã§éããªæ€èšŒã«ããŸãããããã¯æããã«ããåŸãªããïŒããèããå®ç§ãã©ããã¯åããªãã§ãã ãããã¡ãŒã«ãªã @ ãå«ãã§ããããšã¹ããŒã¹ããªããããã§ãã¯ããçšåºŠããã¹ã¯ãŒããªããå
¥åãå§ãŸã£ããã8æå以äžãã®å°ããªãã«ããŒãèŠããŠãè¯ãã§ãããæåã®ããŒå
¥åã§èµ€ããšã©ãŒãåºãã®ã¯é¿ããŸãã
ãŠãŒã¶ãŒããã£ãŒã«ããé¢ãããšãã«ãããå³ããåäžãã£ãŒã«ãã®ã«ãŒã«ãèµ°ãããå¿ èŠãªãã€ã³ã©ã€ã³ãšã©ãŒã衚瀺ããŸããããã«ãå¿ é ãããç¡å¹ãªåœ¢åŒããå ¥ããŸããåæã«ç©ºçœã®ããªãã³ã°ãæ£èŠåïŒã¡ãŒã«ã®å°æååãªã©ïŒãè¡ããšãäœãéä¿¡ãããããŠãŒã¶ãŒã«èŠããããŸãã
éä¿¡æã«ã¯ãã¯ãã¹ãã£ãŒã«ãã«ãŒã«ãå«ããŠãã¹ãŠãåæ€èšŒããŸããå žåäŸã¯ãã¹ã¯ãŒããšç¢ºèªãã¹ã¯ãŒãã®äžèŽã§ãã倱æããããä¿®æ£ãå¿ èŠãªãã£ãŒã«ãã«ãã©ãŒã«ã¹ãç§»ãããã°ã«äžã€ã®æç¢ºãªã¡ãã»ãŒãžã衚瀺ããŸãã
éä¿¡ãã¿ã³ã¯æ éã«æ±ã£ãŠãã ããããŠãŒã¶ãŒããã©ãŒã ãåããŠããéã¯æå¹ã«ä¿ã¡ãŸããã¿ããããŠãäœãããªãç¶æ³ïŒãã§ã«éä¿¡äžãªã©ïŒã®ãšãã ãç¡å¹ã«ããŸããããç¡å¹ã«ãããªããäœãçŽãã°ãããã¯è¿ãã«ç€ºããŠãã ããã
éä¿¡äžã¯ããããããããŒãã£ã³ã°ç¶æ
ã衚瀺ããŸãããã¿ã³ã©ãã«ã ProgressView ã«çœ®ãæããäºéã¿ãããé²ãããã©ãŒã ãèŠãããŸãŸã«ããŠé²è¡ç¶æ³ãçè§£ãããŸãããªã¯ãšã¹ãã1ç§ä»¥äžãããå Žåã¯ãã¢ã«ãŠã³ãäœæäžâŠãã®ãããªçãã©ãã«ã衚瀺ããŠäžå®ãæžãããŸãã
ãŠãŒã¶ãŒãèç«ãããªããµãŒããŒåŽæ€èšŒ
ãµãŒããŒåŽãã§ãã¯ã¯ãããŒã«ã«ã®ãã§ãã¯ã匷åã§ãæçµã®çå®ã®æºã§ãããã¹ã¯ãŒãã¯ã«ãŒã«ãéã£ãŠãããã䜿ãããŠãããã匟ããããããšãããããã¡ãŒã«ã¯æ¢ã«äœ¿ãããŠãããããããŸããã
æå€§ã®UXåäžã¯ãããªãã®å ¥åãåãå ¥ããããªããããšãšããµãŒããŒã«å°éã§ããªããããšãåããããšã§ãããªã¯ãšã¹ããã¿ã€ã ã¢ãŠãããããªãã©ã€ã³ã®å Žåã¯ããã£ãŒã«ããç¡å¹ãšããŠããŒã¯ããªãã§ãã ããããæ¥ç¶ã§ããŸãããããäžåºŠè©ŠããŠãã ããããã®ãããªèœã¡çãããããŒãã¢ã©ãŒãã衚瀺ãããã©ãŒã ã¯ãã®ãŸãŸã«ããŸãã
ãµãŒããŒãæ€èšŒå€±æãè¿ãããããŠãŒã¶ãŒã®å ¥åãä¿æããæ£ç¢ºãªãã£ãŒã«ããæã瀺ããŠãã ããããã©ãŒã ãæ¶ãããã¹ã¯ãŒããã¯ãªã¢ããããã©ãŒã«ã¹ãåæã«ç§»ãã®ã¯ã詊è¡ãããŠãŒã¶ãŒã«çœ°ãäžããããã«æããããŸãã
åçŽãªãã¿ãŒã³ã¯ãæ§é åããããšã©ãŒã¬ã¹ãã³ã¹ããã£ãŒã«ããšã©ãŒãšãã©ãŒã ã¬ãã«ãšã©ãŒã®äºã€ã«åããããšã§ãããããŠããã¹ãã®ãã€ã³ãã£ã³ã°ãå€ããã«UIã¹ããŒããæŽæ°ããŸãã
struct ServerValidation: Decodable {
var fieldErrors: [String: String]
var formError: String?
}
// Map keys like "email" or "password" to your local field IDs.
ãã€ãã£ãã«æããããããšãå€ãå®è·µ:
- ãã£ãŒã«ãã¡ãã»ãŒãžã¯ã€ã³ã©ã€ã³ã§ãå¯èœãªããµãŒããŒã®æèšããã®ãŸãŸäœ¿ãã\n- ãµãŒããŒã®è¿çããã£ãŠããå ¥åäžã«åæã«ãã©ãŒã«ã¹ãç§»ããªããéä¿¡åŸã®ã¿ç§»åããã\n- ãµãŒããŒãè€æ°ã®åé¡ãè¿ãå Žåãåãã£ãŒã«ãã«ã€ãæåã®äžã€ã衚瀺ããŠèªã¿ãããããã\n- ãã£ãŒã«ãã®è©³çްããããªããäœãããããããã ãã«èœãšã蟌ãŸãªãã
äŸ: ãŠãŒã¶ãŒããµã€ã³ã¢ãããéä¿¡ãããµãŒããŒããemail already in useããè¿ããããå ¥åããã¡ãŒã«ã¯ãã®ãŸãŸä¿æããŠãEmailã®äžã«ã¡ãã»ãŒãžã衚瀺ãããã®ãã£ãŒã«ãã«ãã©ãŒã«ã¹ããŸãããµãŒããŒãããŠã³ããŠããå Žåã¯åäžã®ãªãã©ã€ã¡ãã»ãŒãžã衚瀺ãããã¹ãŠã®ãã£ãŒã«ãã¯ãã®ãŸãŸã«ããŸãã
ãµãŒããŒã¡ãã»ãŒãžãé©åãªå Žæã«è¡šç€ºããæ¹æ³
ãµãŒããŒãšã©ãŒãã©ã³ãã ãªãããŒã«è¡šç€ºããããšãäžå ¬å¹³ãã«æããããŸããåã¡ãã»ãŒãžã¯å¯èœãªéãåé¡ãåŒãèµ·ããããã£ãŒã«ãã®è¿ãã«çœ®ããŠãã ãããæ¬åœã«åäžã®å ¥åã«çµã³ä»ããããªãå Žåã®ã¿ãäžè¬çãªã¡ãã»ãŒãžã䜿ããŸãã
ãŸããµãŒããŒã®ãšã©ãŒãã€ããŒããSwiftUIã®ãã£ãŒã«ãèå¥åã«å€æããŸããããã¯ãšã³ã㯠emailãpasswordãprofile.phone ã®ãããªããŒãè¿ããããããŸããããUI㯠Field.email ã Field.password ã®enumã䜿ã£ãŠããã§ããããã¬ã¹ãã³ã¹çŽåŸã«1åã ããããã³ã°ããŠããã®åŸã¯ãã¥ãŒãäžè²«ããŠä¿ã¡ãŸãã
æè»ãªã¢ããªã³ã°æ¹æ³ã¯ serverFieldErrors: [Field: [String]] ãš serverFormErrors: [String] ãä¿æããããšã§ããéåžžã¯1ã€ã ã衚瀺ããŠãé
åãšããŠä¿æããŠãããŸããã€ã³ã©ã€ã³ã§è¡šç€ºããéã¯æã圹ç«ã€ã¡ãã»ãŒãžãåªå
çã«è¡šç€ºããŸããäŸãã°ãEmail already in useãã¯ãInvalid emailãããæçšã§ãã
ãã£ãŒã«ãããšã«è€æ°ã®ãšã©ãŒãããã®ã¯äžè¬çã§ããããã¹ãŠè¡šç€ºãããšéšã ãããªããŸããã»ãšãã©ã®å Žåãã€ã³ã©ã€ã³ã§ã¯æåã®ã¡ãã»ãŒãžã ãã衚瀺ããã©ãããŠãå¿ èŠãªã詳现ãã¥ãŒã«æ®ãã眮ããŸãã
ãã£ãŒã«ãã«çµã³ä»ããªããšã©ãŒïŒã»ãã·ã§ã³åããã¬ãŒããªãããããåŸã§ããçŽããŠãã ããããªã©ïŒã¯ããŠãŒã¶ãŒãã¢ã¯ã·ã§ã³ãèµ·ããå Žæã§ããéä¿¡ãã¿ã³ã®è¿ãã«çœ®ããŸããæåæã«ã¯å€ããšã©ãŒãã¯ãªã¢ããŠUIããåºãŸã£ãŠãããããã«èŠããªãããã«ããŸãã
æåŸã«ããŠãŒã¶ãŒãé¢é£ãã£ãŒã«ãã倿Žãããšãã«ãµãŒããŒãšã©ãŒãã¯ãªã¢ããŸããå®è£
äžã¯ãemail ã® onChange ãã³ãã©ã§ serverFieldErrors[.email] ãåé€ãããšãUIããä¿®æ£äžã ããšå³åº§ã«åæ ããŸãã
ã¢ã¯ã»ã·ããªãã£ãšããŒã³: ãã€ãã£ãã«æããããå°ããªéžæ
è¯ãæ€èšŒã¯ããžãã¯ã ãã§ãªããèªã¿ããããVoiceOverã§ã®æ¯ãèããèšèªããšã®æ±ãã«ãé æ ®ããŸãã
è²ã ãã«é Œãããšã©ãŒãèªã¿ããããã
ããã¹ãã倧ãã衚瀺ãããå¯èœæ§ãåæã«ããŠãã ãããDynamic Typeã«å¯Ÿå¿ããã¹ã¿ã€ã«ïŒ.font(.footnote) ã .font(.caption) ãªã©ïŒã䜿ãããšã©ãŒã©ãã«ã¯æãè¿ããèš±å¯ããŸãããšã©ãŒãåºããšãã«ã¬ã€ã¢ãŠãã倧ããè·³ããªãããã«ééãäžå®ã«ä¿ã¡ãŸãã
èµ€ã ãã«é Œããªãã§ãã ãããã¯ã£ããããã¢ã€ã³ã³ãããšã©ãŒ:ãã®ãã¬ãã£ãã¯ã¹ããããã¯ãã®äž¡æ¹ã远å ããŸããããã«ããè²èŠã«åé¡ããã人ã«ãèŠããããªããã¹ãã£ã³ãããããªããŸãã
å®ãã¹ããã§ãã¯ãªã¹ã:
- Dynamic Typeã«åãããŠã¹ã±ãŒã«ããèªã¿ãããããã¹ãã¹ã¿ã€ã«ã䜿ãã\n- ãšã©ãŒã¡ãã»ãŒãžã¯æãè¿ããèš±å¯ããçç¥ããªãã\n- ã¢ã€ã³ã³ãããšã©ãŒ:ãã®ãããªã©ãã«ãè²ãšäœµçšããã\n- ã©ã€ãã¢ãŒãã»ããŒã¯ã¢ãŒãã®äž¡æ¹ã§ã³ã³ãã©ã¹ããååã«åãã
VoiceOverã«æ£ããå 容ãèªãŸãã
ãã£ãŒã«ããç¡å¹ãªãšããVoiceOverã¯ã©ãã«ãçŸåšã®å€ããšã©ãŒãäžç·ã«èªãã§ã»ããã§ãããã£ãŒã«ãã®äžã«å¥ã® Text ããããšãæèãå€ããŠèªãŸãããã¹ããããããå¯èœæ§ããããŸãã
圹ç«ã€ãã¿ãŒã³ãäºã€ãããŸã:
- ãã£ãŒã«ããšãã®ãšã©ãŒãäžã€ã®ã¢ã¯ã»ã·ããªãã£èŠçŽ ã«çµåããŠããã£ãŒã«ãã«ãã©ãŒã«ã¹ãããšãã«ãšã©ãŒãã¢ããŠã³ã¹ãããããã«ããã\n- ãšã©ãŒæãå«ãã¢ã¯ã»ã·ããªãã£ãã³ããã¢ã¯ã»ã·ããªãã£ã®å€ãèšå®ããïŒäŸ: ããã¹ã¯ãŒããå¿ é ãå°ãªããšã8æåãïŒã
ããŒã³ãéèŠã§ããã¡ãã»ãŒãžã¯æç¢ºã§ããŒã«ã©ã€ãºãããããã®ã«ããŸããä¿èªãåè«ããããŸããªããã£ãšãçãªè¡šçŸã¯é¿ããŸãããã¡ãŒã«ãèŠã€ãããŸããããããã¹ã¯ãŒãã¯æ°åãå«ããŠãã ãããã®ãããªå ·äœçãªæ¡å ãåªå ããŸãã
äŸ: ããŒã«ã«ãšãµãŒããŒã«ãŒã«ãäž¡æ¹æã€ãµã€ã³ã¢ãããã©ãŒã
3ã€ã®ãã£ãŒã«ãïŒEmailãPasswordãConfirm PasswordïŒãæã€ãµã€ã³ã¢ãããã©ãŒã ãæ³åããŠãã ãããç®çã¯ããŠãŒã¶ãŒãå ¥åããŠããéã¯éãã«ããå ã«é²ãããšãããšãã«åœ¹ç«ã€ãã©ãŒã ã§ãã
ãã©ãŒã«ã¹é ïŒReturnã®æåïŒ
SwiftUI ã® FocusState ã䜿ããšãReturnããŒã®æŒäžã¯èªç¶ãªã¹ãããã«æããããŸãã
- Emailã®Return: Passwordã«ãã©ãŒã«ã¹ãç§»ãã\n- Passwordã®Return: Confirm Passwordã«ãã©ãŒã«ã¹ãç§»ãã\n- Confirm Passwordã®Return: ããŒããŒããéããŠéä¿¡ã詊ã¿ãã\n- éä¿¡ã倱æããã: æåã«åé¡ã®ãããã£ãŒã«ãã«ãã©ãŒã«ã¹ãç§»ãã
æåŸã®ã¹ããããéèŠã§ããEmailãç¡å¹ãªãããã©ãŒã«ã¹ã¯Emailã«æ»ããç»é¢ã®ã©ããã«èµ€ãã¡ãã»ãŒãžãããã ãããšããç¶æ ã§ã¯ãããŸããã
ãšã©ãŒãçŸãããšã
UIãèœã¡çãããç°¡åãªã«ãŒã«: ãã£ãŒã«ããè§ŠãããïŒé¢ããïŒããéä¿¡ã詊ã¿ããããšãã«ã¡ãã»ãŒãžã衚瀺ããŸãã
- Email: ãã£ãŒã«ããé¢ããåŸããŸãã¯éä¿¡æã«ãæå¹ãªã¡ãŒã«ã¢ãã¬ã¹ãå ¥åããŠãã ãããã衚瀺ã\n- Password: é¢ããåŸããŸãã¯éä¿¡æã«ã«ãŒã«ïŒæäœé·ãªã©ïŒã衚瀺ã\n- Confirm Password: é¢ããåŸããŸãã¯éä¿¡æã«ããã¹ã¯ãŒããäžèŽããŸãããã衚瀺ã
ãµãŒããŒåŽãæ³å®ããŸãããŠãŒã¶ãŒãéä¿¡ããŠAPIãæ¬¡ã®ãããªJSONãè¿ãããšããŸã:
{
"errors": {
"email": "That email is already in use.",
"password": "Password is too weak. Try 10+ characters."
}
}
ãŠãŒã¶ãŒã«èŠãããã®: Emailã®äžã«ãµãŒããŒã¡ãã»ãŒãžãPasswordã®äžã«ãã®ã¡ãã»ãŒãžã衚瀺ãããŸããConfirm Passwordã¯ããŒã«ã«ã§å€±æããŠããªãéãéãã§ãã
次ã«ããããš: ãã©ãŒã«ã¹ã¯ïŒæåã®ãµãŒããŒãšã©ãŒã§ããïŒEmailã«ç§»åããŸãããŠãŒã¶ãŒã¯Emailã倿ŽããReturnã§Passwordã«ç§»åãããã¹ã¯ãŒãã調æŽããŠããäžåºŠéä¿¡ããŸããã¡ãã»ãŒãžãã€ã³ã©ã€ã³ã§ãã©ãŒã«ã¹ãæå³éãã«ç§»åããã®ã§ããã©ãŒã ã¯ååçã«æããããå±è²¬çã§ã¯ãããŸããã
æ€èšŒããiOSããããªãããšæããããäžè¬çãªèœãšã穎
ãã©ãŒã ã¯æè¡çã«æ£ãããŠããæããæªããã°ééã£ãŠèŠããŸããã»ãšãã©ã®ãiOSããããªããæ€èšŒåé¡ã¯ã¿ã€ãã³ã°ã«èµ·å ããŸã: ãã€ãšã©ãŒã衚瀺ãããããã€ãã©ãŒã«ã¹ãç§»ããããµãŒããŒã«ã©ãåå¿ãããã
ãããããã¹ã¯æ©ãããéç¥ã§ããæåã®ããŒå ¥åã§ãšã©ãŒãåºããšããŠãŒã¶ãŒã¯å ¥åäžã«å±ãããŠããããã«æããŸãããã£ãŒã«ããè§ŠãããïŒé¢ããïŒãéä¿¡ã詊ã¿ããããšããŸã§åŸ ã€ãšå€§æµè§£æ±ºããŸãã
éåæã®ãµãŒããŒã¬ã¹ãã³ã¹ããããŒãå£ããŸãããµã€ã³ã¢ããã®ãªã¯ãšã¹ããè¿ã£ãŠããŠçªç¶å¥ã®ãã£ãŒã«ãã«ãã©ãŒã«ã¹ãç§»ããšã©ã³ãã ã«æããããŸãããŠãŒã¶ãŒãæåŸã«ããå Žæã«ãã©ãŒã«ã¹ãä¿ã¡ãéä¿¡åŠçãããŠãããšãã ãç§»åãããŸãã
ããäžã€ã®çœ ã¯ç·šéã®ãã³ã«å šãŠãã¯ãªã¢ããŠããŸãããšã§ããä»»æã®æåãå€ãã£ãç¬éã«å šãšã©ãŒãæ¶ããšãç¹ã«ãµãŒããŒã¡ãã»ãŒãžã§æ¬åœã®åé¡ãé ããŠããŸããŸããç·šéäžã®ãã£ãŒã«ãã®ãšã©ãŒã ããã¯ãªã¢ããä»ã¯å®éã«ä¿®æ£ããããŸã§æ®ããŸãã
ã説æã®ãªãç¡å¹åããããéä¿¡ãã¿ã³ãé¿ããŠãã ãããéä¿¡ãæ°žé ã«ç¡å¹ã«ãããšäœãçŽããæšæž¬ãããŠããŸããŸããç¡å¹ã«ãããªãå ·äœçãªãã³ããä»ããããéä¿¡ãèš±å¯ããŠæåã®åé¡ãžèªå°ããŠãã ããã
é ããªã¯ãšã¹ããäºéã¿ããã«ã泚æããé²è¡ã衚瀺ããŠäºééä¿¡ãé²ããªããšããŠãŒã¶ãŒã¯2åã¿ããããŠäºã€ã®ã¬ã¹ãã³ã¹ãåãåããæ··ä¹±ãããšã©ãŒã«ãªããŸãã
ç°¡åãªãµããã£ãã§ãã¯:
- ãšã©ãŒã¯ãŒããïŒblurïŒãéä¿¡ãŸã§é å»¶ãããæåã®æåã§åºããªãã\n- ãµãŒããŒå¿çã®åŸã«ãŠãŒã¶ãŒãèŠæ±ããªãéããã©ãŒã«ã¹ãç§»åããªãã\n- ãã£ãŒã«ãããšã«ãšã©ãŒãã¯ãªã¢ããäžåºŠã«å šãŠã¯æ¶ããªãã\n- éä¿¡ããããã¯ãããŠããçç±ã説æããïŒãããã¯ã¬ã€ãä»ãã§éä¿¡ãèš±å¯ããïŒã\n- åŸ æ©äžã¯ããŒãã£ã³ã°ã衚瀺ãã远å ã¿ããã¯ç¡èŠããã
äŸ: ãµãŒããŒããemail already in useããšèšã£ãå ŽåïŒäŸãã°AppMasterã䜿ã£ãŠæ§ç¯ããããã¯ãšã³ãããïŒãEmailã®äžã«ã¡ãã»ãŒãžã眮ããPasswordã¯è§ŠããããŠãŒã¶ãŒãEmailãç·šéããŠããã©ãŒã å šäœãåèµ·åããªãã§ãã ããã
ã¯ã€ãã¯ãã§ãã¯ãªã¹ããšæ¬¡ã®ã¹ããã
ãã€ãã£ãã«æããæ€èšŒäœéšã¯äž»ã«ã¿ã€ãã³ã°ãšç¯åºŠã«é¢ãããã®ã§ããå³ããã«ãŒã«ããã£ãŠãç»é¢ãèœã¡çãããããšãã§ããŸãã
åºè·åã«ããã確èªããŠãã ãã:
- é©åãªã¿ã€ãã³ã°ã§æ€èšŒãããæåã®ããŒå ¥åã§ãšã©ãŒãåºããªãã\n- ç®çãæã£ãŠãã©ãŒã«ã¹ãç§»ããéä¿¡æã«æåã®ç¡å¹ãã£ãŒã«ããžãžã£ã³ãããäœãæªãããæç€ºããã\n- èšãåãã¯çãå ·äœçã«ããŠãŒã¶ãŒã次ã«äœããã¹ããã瀺ãã\n- ããŒãã£ã³ã°ãšãªãã©ã€ãå°éãããéä¿¡äžã¯ãã¿ã³ãç¡å¹ã«ããŠããªã¯ãšã¹ãã倱æããŠãå ¥åå€ã¯ä¿æããã\n- ãµãŒããŒãšã©ãŒã¯å¯èœãªããã£ãŒã«ããã£ãŒãããã¯ãšããŠæ±ãããµãŒããŒã³ãŒãããã£ãŒã«ãã«ãããã³ã°ããçã«ã°ããŒãã«ãªåé¡ã ãã§ãããã¡ãã»ãŒãžã䜿ãã
ãã®åŸã¯äººéãšããŠãã¹ãããŠãã ãããçæã§å°ããªé»è©±ãæã¡ã芪æã§ãã©ãŒã ãæäœããŠã¿ãŸãããã®åŸVoiceOverããªã³ã«ããŠããã©ãŒã«ã¹é ããšã©ãŒã®ã¢ããŠã³ã¹ããã¿ã³ã©ãã«ãæå³ãæãã確èªããŠãã ããã
ãããã°ãšãµããŒãã®ããã«ãç»é¢åãšãã£ãŒã«ãåãšäžç·ã«ãµãŒããŒæ€èšŒã³ãŒãïŒçã¡ãã»ãŒãžã§ã¯ãªãïŒããã°ã«æ®ããšäŸ¿å©ã§ãããŠãŒã¶ãŒãããµã€ã³ã¢ããã§ããªãããšèšã£ããšãã«ãemail_takenãweak_passwordããããã¯ãããã¯ãŒã¯ã¿ã€ã ã¢ãŠãããçŽ æ©ãææ¡ã§ããŸãã
ã¢ããªå šäœã§äžè²«æ§ãä¿ã€ã«ã¯ããã£ãŒã«ãã¢ãã«ïŒvalueãtouchedãlocal errorãserver errorïŒããšã©ãŒã®é 眮ããã©ãŒã«ã¹ã«ãŒã«ãæšæºåããŸãããã€ãã£ããªiOSãã©ãŒã ãææ©ãäœããããªããæäœæ¥ã§å šç»é¢ãã³ãŒãã£ã³ã°ãã代ããã«AppMaster (appmaster.io) ã®ãããªããŒã«ã§SwiftUIã¢ããªãšããã¯ãšã³ããçæããããšã§ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®æ€èšŒã«ãŒã«ãæãããããªããŸãã


