不使用 Delegate 情況下,用 KVO (Key-Value Observing) 觀察 UITextField 的 text 屬性變化。
[textField addObserver:self forKeyPath:@"text" options:0 context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"text"] && object == textField) {
// 文本已變更
NSString *newText = textField.text;
// 處理邏輯
}
}
// 移除觀察(dealloc 或 viewDidDisappear)
[textField removeObserver:self forKeyPath:@"text"];
options:0 表示不需要新舊值字典,若需舊值用 NSKeyValueObservingOptionOld。| 方式 | 優點 | 缺點 |
|---|---|---|
Delegate (textField:shouldChangeCharactersInRange:) | 可攔截/修改輸入,區分用戶操作 | 需設置 delegate,單一監聽者 |
| KVO | 多對象可觀察同一屬性,無侵入式 | 程序化賦值也觸發,需額外過濾 |
Notification (UITextFieldTextDidChangeNotification) | 系統級廣播,解耦 | 同上,且需註冊通知中心 |
KVO 靈活監聽屬性變化,適合非 Delegate 場景。