รับค่าของ UITextField เมื่อป้อนการกดแป้นพิมพ์หรือไม่


107

สมมติว่าฉันมีรหัสต่อไปนี้:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

ฉันต้องการgreetingLabelให้อ่าน "สวัสดี [nameTextField]" ทันทีที่ผู้ใช้กดปุ่มใด ๆ

สิ่งที่ฉันต้องการโดยทั่วไปเป็นเทียบเท่า iPhone controlTextDidChangeของวิธีการผู้รับมอบสิทธิ์โกโก้

มีtextField:shouldChangeCharactersInRange:การเรียกวิธีการมอบหมายทุกครั้งที่เกิดการกดแป้นพิมพ์:

- (BOOL)              textField:(UITextField *)textField
  shouldChangeCharactersInRange:(NSRange)range     
              replacementString:(NSString *)string

อาร์กิวเมนต์สตริงจะส่งคืนอักขระที่ถูกกด อย่างไรก็ตามค่าจริงtextField( nameTextField.text) ยังคงว่างเปล่า

ฉันพลาดอะไรไปที่นี่? (ฉันต้องการnameTextFieldแสดงสตริงที่แน่นอนที่ผู้ใช้ป้อนจนถึงตอนนี้)

คำตอบ:


197

ปรากฎว่าวิธีที่ง่ายที่สุดคือการใช้ Interface Builder:

  • เพิ่ม IBAction (ใน ViewController เช่นในกรณีนี้)
  • Ctrl-Click (หรือคลิกขวา) บน UITextField ใน Interface Builder
  • เชื่อมต่อเหตุการณ์ "แก้ไขเปลี่ยนแปลง" กับ IBAction ของเจ้าของไฟล์ที่เพิ่มในขั้นตอนแรก

ใช้งานได้เหมือนมีเสน่ห์ :) (ไม่อยากจะเชื่อเลยว่าฉันใช้เวลาหลายวันกับสิ่งนี้และเมื่อรู้แล้วว่าวิธีแก้ปัญหานั้นง่ายกว่าที่ฉันคิดไว้มาก: P)


2
ขอบคุณ! ฉันใช้ "Value Changed" เหมือนที่คุณใช้กับ UISlider เป็นต้นน่าสนใจว่ามีเหตุการณ์สองเหตุการณ์ที่ดูเหมือนจะมีพฤติกรรมเหมือนกัน
wjl

1
ด้วยเหตุผลบางอย่างฉันยังคงต้องการวิธีแบบเป็นโปรแกรมในการทำสิ่งนี้ ... แต่ฉันให้ใน ... วิธีนี้ Rocks! ขอบคุณสำหรับการแบ่งปัน ... ฉันเคยเห็นมันมาก่อน แต่หลังจากหลายวันของการเขียนโปรแกรมสมองของฉันก็ไม่ทำงานอีกต่อไปฮิฮิ
Albert Renshaw

8
@AlbertRenshaw แต่คุณสามารถทำได้ในรูปแบบโปรแกรม;) เพียงแค่ดำเนินการ[textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];)
Vive

101

คุณสามารถลงทะเบียนการดำเนินการสำหรับเหตุการณ์ UIControlEventEditingChanges บนฟิลด์ข้อความ:

[nameTextField addTarget:self action:@selector(updateLabelUsingContentsOfTextField:) forControlEvents:UIControlEventEditingChanged];

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

    greetingLabel.text = [NSString stringWithFormat:@"Hello %@", ((UITextField *)sender).text];

}

มีวิธีระบุสิ่งนี้โดยใช้ Interface Builder หรือไม่?
PlagueHammer

11

UITextFieldมีการแจ้งเตือนUITextFieldTextDidChangeซึ่งจะเริ่มทำงานทุกครั้งที่ข้อความเปลี่ยนแปลงหากคุณลงทะเบียน เพียงลงทะเบียนสำหรับการแจ้งเตือนนั้นและในวิธีการที่เรียกโดยการแจ้งเตือนให้เปลี่ยนข้อความของป้ายกำกับ

ในการเพิ่มสิ่งนี้วัตถุที่ส่งไปยังเครื่องจัดการการแจ้งเตือนของคุณจะมีข้อความของไฟล์UITextField.

หวังว่าจะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.