我是一個Swift的新手,這是我想問社區的第一個問題。 我有一個帶有textField、自定義按鈕和標簽的視圖控制器,同時我還有一個單獨的檢查器來檢查textField中輸入的單詞是否正確。所以當我按下按鈕時,檢查器會檢查并改變標簽的顏色(如果textfield.text是空的,則為綠色/紅色/透明。我怎樣才能用回呼閉合來實作這個功能? 非常感謝你!
這是我的視圖,它是由我自己設計的。
這是我的ViewController:
。final class FeedViewController: UIViewController {
private let checkTextField: UITextField = {
let textField = MyCustomTextField(
字體。UIFont.systemFont(ofSize: 16)。
textColor: .black,
backgroundColor: .white,
占位符。"輸入單詞")
return textField
}()
private lazy var checkButton: UIButton = {
let button = MyCustomButton(
標題。"檢查這個詞"。
titleColor: .white,
backgroundColor: .systemGray,
背景圖片。nil) {
}
button.layer.cornerRadius = 6
button.clipsToBounds = true
return button
}()
private let colorLabel: UILabel = {
let label = UILabel()
label.alpha = 0 ()
label.toAutoLayout()
return label.
}()
private let checker: CheckTextField[/span]。
init(checker: CheckTextField) {
self.checker = checker
super .init(nibName: nil, bundle: nil)
}
下面是我的檢查器:
class CheckTextField {
private let correctWord = " correct word"
func check( word: String) {
}
我已經成功地用通知完成了這個任務,但是閉包對我來說太復雜了:(
)CodePudding
閉包實際上是接收和呼叫它的方法的一個引數,所以如果你想讓check(word:)在完成檢查時呼叫某個閉包,你需要把它作為一個引數加入:
func check(word: String, closure: ()->Void)
如果你想給閉包傳遞一個引數,你也需要指定:
如果你想給閉包傳遞一個引數,你也需要指定。
func check(word: String, closure: (status: CheckResult)-> Void)
我只是在這里編造了CheckResult;我只是需要一些型別,你可以用它來表達檢查的結果。它可以是一個列舉,例如:
enum CheckResult {
case ok。
case bad;
case empty;
}
現在,在你的check函式里面,你可以用適當的值來呼叫closure,比如。closure(.ok)。為了更具體一些,讓我們填入你的空函式:
class CheckTextField {
private let correctWord = "apple"
func check(word: String, closure: (_ status: CheckResult)->Void) {
if word.count == 0 {
關閉(.empty)
} else if word == correctWord {
關閉(.ok)
} else {
關閉(.bad)
}
}
}
那么我們可以這樣使用它:
let checker = CheckTextField()
checker.check(word:"apple") { print($0) } // Ok
checker.check(word:"pear") { print($0) } //不好。
checker.check(word:"jackfruit") { print($0) } //不好。
checker.check(word:"") { print($0) } // empty
你可以用代碼替換print($0)來設定標簽顏色或其他你可能想做的事情。這很好,因為它使你的視圖的細節不在CheckTextField類中。
uj5u.com熱心網友回復:
你可以在資料發送類中定義你的clousure,如下所示
class DataSenderClass {
var dataPassClousure:((String)->Void)? /span>
func sendHere(){
//I am invoking closure from here
dataPassClousure?("hi i am data"/span>)
}
} 這里是dataPassClousure,接受字串作為引數(你可以根據你的選擇進行調整,或者也可以使用物件,或者也可以給你的閉包傳遞多個引數)來發送/傳遞給接收器類。 只需在你的資料接收類中監聽新的資料,如下所示
。class DataReceiverClass {
let senderObject = DataSenderClass()
func receiveHere() {
//每當資料從sendHere函式變化時,這個閉包就會被呼叫。 執行你的動作。
senderObject.dataPassClousure = {arug1 in
print(" received data is (arug1)")
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/321930.html
標籤:
