From e52c4f5bb300b8b3395a97e9af8f2f54558e4060 Mon Sep 17 00:00:00 2001 From: Aaron Lee Date: Sun, 27 Dec 2020 00:17:35 +0900 Subject: [PATCH 1/3] feat: Add shouldReturn closure --- .../project.pbxproj | 75 ++++++++++++++++--- .../xcschemes/RespondableTextField.xcscheme | 2 +- .../RespondableTextFieldTests.xcscheme | 2 +- .../RespondableTextField.swift | 13 +++- 4 files changed, 76 insertions(+), 16 deletions(-) diff --git a/RespondableTextField.xcodeproj/project.pbxproj b/RespondableTextField.xcodeproj/project.pbxproj index 5672ea0..38f9fea 100644 --- a/RespondableTextField.xcodeproj/project.pbxproj +++ b/RespondableTextField.xcodeproj/project.pbxproj @@ -52,8 +52,8 @@ OBJ_18 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; OBJ_9 /* RespondableTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RespondableTextField.swift; sourceTree = ""; }; - "RespondableTextField::RespondableTextField::Product" /* RespondableTextField.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RespondableTextField.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - "RespondableTextField::RespondableTextFieldTests::Product" /* RespondableTextFieldTests.xctest */ = {isa = PBXFileReference; lastKnownFileType = file; path = RespondableTextFieldTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + "RespondableTextField::RespondableTextField::Product" /* RespondableTextField.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RespondableTextField.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + "RespondableTextField::RespondableTextFieldTests::Product" /* RespondableTextFieldTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; path = RespondableTextFieldTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -188,7 +188,7 @@ isa = PBXProject; attributes = { LastSwiftMigration = 9999; - LastUpgradeCheck = 9999; + LastUpgradeCheck = 1230; }; buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "RespondableTextField" */; compatibilityVersion = "Xcode 3.2"; @@ -262,7 +262,7 @@ ); HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = RespondableTextField.xcodeproj/RespondableTextField_Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; MACOSX_DEPLOYMENT_TARGET = 10.10; OTHER_CFLAGS = "$(inherited)"; @@ -275,7 +275,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; SWIFT_VERSION = 5.0; TARGET_NAME = RespondableTextField; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 12.0; WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Debug; @@ -290,7 +290,7 @@ ); HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = RespondableTextField.xcodeproj/RespondableTextField_Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; MACOSX_DEPLOYMENT_TARGET = 10.10; OTHER_CFLAGS = "$(inherited)"; @@ -303,7 +303,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; SWIFT_VERSION = 5.0; TARGET_NAME = RespondableTextField; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 12.0; WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Release; @@ -330,17 +330,44 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "SWIFT_PACKAGE=1", "DEBUG=1", ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.10; ONLY_ACTIVE_ARCH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -DXcode"; @@ -368,8 +395,8 @@ OBJ_39 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ENABLE_MODULES = YES; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PLATFORM_DIR)/Developer/Library/Frameworks", @@ -385,7 +412,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; SWIFT_VERSION = 5.0; TARGET_NAME = RespondableTextFieldTests; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 12.0; WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Debug; @@ -394,15 +421,41 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = s; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "SWIFT_PACKAGE=1", ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.10; OTHER_SWIFT_FLAGS = "$(inherited) -DXcode"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -417,8 +470,8 @@ OBJ_40 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ENABLE_MODULES = YES; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PLATFORM_DIR)/Developer/Library/Frameworks", @@ -434,7 +487,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; SWIFT_VERSION = 5.0; TARGET_NAME = RespondableTextFieldTests; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 12.0; WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Release; diff --git a/RespondableTextField.xcodeproj/xcshareddata/xcschemes/RespondableTextField.xcscheme b/RespondableTextField.xcodeproj/xcshareddata/xcschemes/RespondableTextField.xcscheme index 327e2be..512c985 100644 --- a/RespondableTextField.xcodeproj/xcshareddata/xcschemes/RespondableTextField.xcscheme +++ b/RespondableTextField.xcodeproj/xcshareddata/xcschemes/RespondableTextField.xcscheme @@ -1,6 +1,6 @@ Void)? let didBeginEditing: (() -> Void)? let didEndEditing: (() -> Void)? + let shouldReturn: ((String?) -> Void)? // MARK: - INIT @@ -31,7 +32,8 @@ public struct RespondableTextField: UIViewRepresentable { placeholder: String? = nil, onEditing: ((String) -> Void)? = nil, didBeginEditing: (() -> Void)? = nil, - didEndEditing: (() -> Void)? = nil + didEndEditing: (() -> Void)? = nil, + shouldReturn: ((String?) -> Void)? = nil ) { self._text = text self.tag = tag @@ -40,6 +42,7 @@ public struct RespondableTextField: UIViewRepresentable { self.onEditing = onEditing self.didBeginEditing = didBeginEditing self.didEndEditing = didEndEditing + self.shouldReturn = shouldReturn } // MARK: - UIViewRepresentable @@ -69,7 +72,7 @@ public struct RespondableTextField: UIViewRepresentable { extension RespondableTextField { public func makeCoordinator() -> RespondableTextField.Coordinator { - return Coordinator(text: $text, tag: tag, isFirstResponder: isFirstResponder, placeholder: placeholder, onEditing: onEditing, didBeginEditing: didBeginEditing, didEndEditing: didEndEditing) + return Coordinator(text: $text, tag: tag, isFirstResponder: isFirstResponder, placeholder: placeholder, onEditing: onEditing, didBeginEditing: didBeginEditing, didEndEditing: didEndEditing, shouldReturn: shouldReturn) } public class Coordinator: NSObject, UITextFieldDelegate { @@ -84,6 +87,7 @@ extension RespondableTextField { let onEditing: ((String) -> Void)? let didBeginEditing: (() -> Void)? let didEndEditing: (() -> Void)? + let shouldReturn: ((String?) -> Void)? // MARK: - INIT @@ -94,7 +98,8 @@ extension RespondableTextField { placeholder: String? = nil, onEditing: ((String) -> Void)? = nil, didBeginEditing: (() -> Void)? = nil, - didEndEditing: (() -> Void)? = nil + didEndEditing: (() -> Void)? = nil, + shouldReturn: ((String?) -> Void)? = nil ) { self._text = text self.tag = tag @@ -103,6 +108,7 @@ extension RespondableTextField { self.onEditing = onEditing self.didBeginEditing = didBeginEditing self.didEndEditing = didEndEditing + self.shouldReturn = shouldReturn } public func textFieldDidChangeSelection(_ textField: UITextField) { @@ -125,6 +131,7 @@ extension RespondableTextField { } else { textField.resignFirstResponder() } + shouldReturn?(textField.text) return false } From 8d1c04d930ef5301c5dbdfa322461d840247c510 Mon Sep 17 00:00:00 2001 From: Aaron Lee Date: Sun, 27 Dec 2020 00:18:05 +0900 Subject: [PATCH 2/3] chore: Edit Example --- .../xcshareddata/xcschemes/Example.xcscheme | 78 ++++++++++ Example/Example/ContentView.swift | 138 ++++++++++-------- 2 files changed, 153 insertions(+), 63 deletions(-) create mode 100644 Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme diff --git a/Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme b/Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme new file mode 100644 index 0000000..1cc5671 --- /dev/null +++ b/Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Example/ContentView.swift b/Example/Example/ContentView.swift index e41d885..e75e384 100644 --- a/Example/Example/ContentView.swift +++ b/Example/Example/ContentView.swift @@ -19,78 +19,90 @@ struct ContentView: View { // MARK: - BODY var body: some View { - VStack(alignment: .leading, spacing: 30) { + + ScrollView(showsIndicators: false) { - // Default - Group { - Text("Default") - .font(.system(size: 14, weight: .bold, design: .default)) - RespondableTextField(text: $text1, tag: 0, isFirstResponder: true, placeholder: "1st") { value in - print("onEditing: \(value)") - } didBeginEditing: { - print("didBeginEditing") - } didEndEditing: { - print("didEndEditing") + VStack(alignment: .leading, spacing: 30) { + + // Default + Group { + Text("Default") + .font(.system(size: 14, weight: .bold, design: .default)) + RespondableTextField(text: $text1, tag: 0, isFirstResponder: true, placeholder: "1st") { value in + print("onEditing: \(value)") + } didBeginEditing: { + print("didBeginEditing") + } didEndEditing: { + print("didEndEditing") + } shouldReturn: { value in + print("shouldReturn: \(value ?? "N/A")") + } + + Text(text1) } - Text(text1) - } - - // SecureType + RectangleLine Border - Group { - Text("SecureType + RectangleLine Border") - .font(.system(size: 14, weight: .bold, design: .default)) - RespondableTextField(text: $text2, tag: 1, placeholder: "2nd") { value in - print("onEditing: \(value)") - } didBeginEditing: { - print("didBeginEditing") - } didEndEditing: { - print("didEndEditing") + // SecureType + RectangleLine Border + Group { + Text("SecureType + RectangleLine Border") + .font(.system(size: 14, weight: .bold, design: .default)) + RespondableTextField(text: $text2, tag: 1, placeholder: "2nd") { value in + print("onEditing: \(value)") + } didBeginEditing: { + print("didBeginEditing") + } didEndEditing: { + print("didEndEditing") + } shouldReturn: { value in + print("shouldReturn: \(value ?? "N/A")") + } + .respondableSecureType() + .respondableLineStyle() + + Text(text2) } - .respondableSecureType() - .respondableLineStyle() - Text(text2) - } - - // NumberPad + OneTimeCode + Rounded Border - Group { - Text("NumberPad + OneTimeCode + Rounded Border") - .font(.system(size: 14, weight: .bold, design: .default)) - RespondableTextField(text: $text3, tag: 2, placeholder: "3rd") { value in - print("onEditing: \(value)") - } didBeginEditing: { - print("didBeginEditing") - } didEndEditing: { - print("didEndEditing") + // NumberPad + OneTimeCode + Rounded Border + Group { + Text("NumberPad + OneTimeCode + Rounded Border") + .font(.system(size: 14, weight: .bold, design: .default)) + RespondableTextField(text: $text3, tag: 2, placeholder: "3rd") { value in + print("onEditing: \(value)") + } didBeginEditing: { + print("didBeginEditing") + } didEndEditing: { + print("didEndEditing") + } shouldReturn: { value in + print("shouldReturn: \(value ?? "N/A")") + } + .respondableKeyboardType(.numberPad) + .respondableContentType(.oneTimeCode) + .textFieldStyle(RoundedBorderTextFieldStyle()) + + Text(text3) } - .respondableKeyboardType(.numberPad) - .respondableContentType(.oneTimeCode) - .textFieldStyle(RoundedBorderTextFieldStyle()) - Text(text3) - } - - // didEndEditing + Bazel Border + Font - Group { - Text("didBeginEditing + didEndEditing + Bazel Border") - .font(.system(size: 14, weight: .bold, design: .default)) - RespondableTextField(text: $text4, tag: 3, placeholder: "4th") { value in - print("onEditing: \(value)") - } didBeginEditing: { - print("didBeginEditing") - } didEndEditing: { - print("didEndEditing") + // didEndEditing + Bazel Border + Font + Group { + Text("didBeginEditing + didEndEditing + Bazel Border") + .font(.system(size: 14, weight: .bold, design: .default)) + RespondableTextField(text: $text4, tag: 3, placeholder: "4th") { value in + print("onEditing: \(value)") + } didBeginEditing: { + print("didBeginEditing") + } didEndEditing: { + print("didEndEditing") + } shouldReturn: { value in + print("shouldReturn: \(value ?? "N/A")") + } + .respondableBezelStyle() + .respondableFont(.systemFont(ofSize: 20, weight: .bold)) + + Text(text4) } - .respondableBezelStyle() - .respondableFont(.systemFont(ofSize: 20, weight: .bold)) - Text(text4) - } - - } //: V - .padding() - + } //: V + .padding() + } //: S + .preferredColorScheme(.light) } } From 58a160108d8964239626291f864afe7049e23f7b Mon Sep 17 00:00:00 2001 From: Aaron Lee Date: Sun, 27 Dec 2020 00:18:15 +0900 Subject: [PATCH 3/3] docs: Update README.md --- README.md | 152 +++++++++++++++++++++++++++++------------------------- 1 file changed, 83 insertions(+), 69 deletions(-) diff --git a/README.md b/README.md index 9cad0bb..31af1bb 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ ![Platform: iOS 13+](https://img.shields.io/badge/platform-iOS%2013%2B-blue?style=flat&logo=apple) ![SwiftPM compatible](https://img.shields.io/badge/SPM-compatible-brightgreen?style=flat&logo=swift) [![License: MIT](https://img.shields.io/badge/license-MIT-lightgrey?style=flat)](https://github.com/aaronLab/SweetCardScanner/blob/main/LICENSE) +[![Release version](https://img.shields.io/badge/release-v1.0.0-blue)](https://github.com/aaronLab/RespondableTextField/releases/tag/v1.0.0) # RespondableTextField @@ -35,7 +36,8 @@ placeholder: String? = nil, onEditing: ((String) -> Void)? = nil, didBeginEditing: (() -> Void)? = nil, - didEndEditing: (() -> Void)? = nil + didEndEditing: (() -> Void)? = nil, + shouldReturn: ((String?) -> Void)? = nil ) ``` @@ -68,78 +70,90 @@ struct ContentView: View { // MARK: - BODY var body: some View { - VStack(alignment: .leading, spacing: 30) { - - // Default - Group { - Text("Default") - .font(.system(size: 14, weight: .bold, design: .default)) - RespondableTextField(text: $text1, tag: 0, isFirstResponder: true, placeholder: "1st") { value in - print("onEditing: \(value)") - } didBeginEditing: { - print("didBeginEditing") - } didEndEditing: { - print("didEndEditing") + + ScrollView(showsIndicators: false) { + + VStack(alignment: .leading, spacing: 30) { + + // Default + Group { + Text("Default") + .font(.system(size: 14, weight: .bold, design: .default)) + RespondableTextField(text: $text1, tag: 0, isFirstResponder: true, placeholder: "1st") { value in + print("onEditing: \(value)") + } didBeginEditing: { + print("didBeginEditing") + } didEndEditing: { + print("didEndEditing") + } shouldReturn: { value in + print("shouldReturn: \(value ?? "N/A")") + } + + Text(text1) } - - Text(text1) - } - - // SecureType + RectangleLine Border - Group { - Text("SecureType + RectangleLine Border") - .font(.system(size: 14, weight: .bold, design: .default)) - RespondableTextField(text: $text2, tag: 1, placeholder: "2nd") { value in - print("onEditing: \(value)") - } didBeginEditing: { - print("didBeginEditing") - } didEndEditing: { - print("didEndEditing") + + // SecureType + RectangleLine Border + Group { + Text("SecureType + RectangleLine Border") + .font(.system(size: 14, weight: .bold, design: .default)) + RespondableTextField(text: $text2, tag: 1, placeholder: "2nd") { value in + print("onEditing: \(value)") + } didBeginEditing: { + print("didBeginEditing") + } didEndEditing: { + print("didEndEditing") + } shouldReturn: { value in + print("shouldReturn: \(value ?? "N/A")") + } + .respondableSecureType() + .respondableLineStyle() + + Text(text2) } - .respondableSecureType() - .respondableLineStyle() - - Text(text2) - } - - // NumberPad + OneTimeCode + Rounded Border - Group { - Text("NumberPad + OneTimeCode + Rounded Border") - .font(.system(size: 14, weight: .bold, design: .default)) - RespondableTextField(text: $text3, tag: 2, placeholder: "3rd") { value in - print("onEditing: \(value)") - } didBeginEditing: { - print("didBeginEditing") - } didEndEditing: { - print("didEndEditing") + + // NumberPad + OneTimeCode + Rounded Border + Group { + Text("NumberPad + OneTimeCode + Rounded Border") + .font(.system(size: 14, weight: .bold, design: .default)) + RespondableTextField(text: $text3, tag: 2, placeholder: "3rd") { value in + print("onEditing: \(value)") + } didBeginEditing: { + print("didBeginEditing") + } didEndEditing: { + print("didEndEditing") + } shouldReturn: { value in + print("shouldReturn: \(value ?? "N/A")") + } + .respondableKeyboardType(.numberPad) + .respondableContentType(.oneTimeCode) + .textFieldStyle(RoundedBorderTextFieldStyle()) + + Text(text3) } - .respondableKeyboardType(.numberPad) - .respondableContentType(.oneTimeCode) - .textFieldStyle(RoundedBorderTextFieldStyle()) - - Text(text3) - } - - // didEndEditing + Bazel Border + Font - Group { - Text("didBeginEditing + didEndEditing + Bazel Border") - .font(.system(size: 14, weight: .bold, design: .default)) - RespondableTextField(text: $text4, tag: 3, placeholder: "4th") { value in - print("onEditing: \(value)") - } didBeginEditing: { - print("didBeginEditing") - } didEndEditing: { - print("didEndEditing") + + // didEndEditing + Bazel Border + Font + Group { + Text("didBeginEditing + didEndEditing + Bazel Border") + .font(.system(size: 14, weight: .bold, design: .default)) + RespondableTextField(text: $text4, tag: 3, placeholder: "4th") { value in + print("onEditing: \(value)") + } didBeginEditing: { + print("didBeginEditing") + } didEndEditing: { + print("didEndEditing") + } shouldReturn: { value in + print("shouldReturn: \(value ?? "N/A")") + } + .respondableBezelStyle() + .respondableFont(.systemFont(ofSize: 20, weight: .bold)) + + Text(text4) } - .respondableBezelStyle() - .respondableFont(.systemFont(ofSize: 20, weight: .bold)) - - Text(text4) - } - - } //: V - .padding() - + + } //: V + .padding() + } //: S + .preferredColorScheme(.light) } }