2013-08-16 34 views
5

Hy vọng ai đó có thể làm sáng tỏ điều này.Thực hiện hành động sau một chút chậm trễ khi gõ vào UITextField

Tôi đang làm việc trên ứng dụng cho một công ty và họ có trường tìm kiếm là UITextField tùy chỉnh. Hiện nay nó tinh chỉnh tìm kiếm với mỗi chữ cái được nhập vào.

Sự cố: Họ có cửa sổ bật lên nhỏ cho biết rằng nó đang tìm kiếm và với mỗi lần nhấn phím, bạn sẽ thấy đèn flash bật và tắt màn hình. Họ không muốn điều này, rõ ràng.

Điều tôi đã nghĩ đến khi làm mặc dù không chắc chắn cách thay vì tinh chỉnh tìm kiếm trên mỗi lần nhấn phím, tìm kiếm khi họ nhập xong. NHƯNG, tôi cũng không muốn phải thêm nút "Tìm kiếm". Tôi chỉ muốn họ hoàn thành việc gõ, một giây, chậm trễ hoặc một cái gì đó, tìm kiếm xảy ra.

Có cách nào để phát hiện khi người dùng nhập xong không? Có ai đã làm điều này?

Xin cảm ơn trước.

+0

có thể trùng lặp của [? Làm thế nào để phát hiện một tạm dừng ở đầu vào cho UISearchBar/UITextField] (http://stackoverflow.com/questions/7061377/how-to-detect -a-pause-in-input-for-uisearchbar-uitextfield) – Cristik

Trả lời

7

Bạn có thể làm điều này với một NSTimer đơn giản. Trong shouldChangeCharactersInRange: kiểm tra xem bộ hẹn giờ có hợp lệ không và nếu đúng, hãy vô hiệu hóa bộ hẹn giờ, sau đó khởi động lại bộ hẹn giờ. Khi thời gian cuối cùng được bật to, điều đó có nghĩa là người dùng đã không nhập bất kỳ thứ gì trong khoảng thời gian bạn chỉ định cho thời gian.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    if (someTimer.isValid) { 
     [someTimer invalidate]; 
    } 
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO]; 

    return YES; 
} 

Như @Jai Govindani chỉ ra để thực hiện phương pháp này, bạn sẽ cần phải gán điều khiển của bạn như các đại biểu của các UITextField của bạn và chắc chắn rằng điều khiển của bạn phù hợp với các giao thức UITextFieldDelegate.

+0

đừng quên đặt mình là đại biểu của UITextField đầu tiên, tất nhiên là –

+0

Điều này có ý nghĩa và đó là một khởi đầu tuyệt vời nhưng tôi đang gặp sự cố. Có lẽ do vấn đề khởi tạo? Tôi gõ một chữ cái đầu tiên trong lĩnh vực này, không có gì xảy ra (ngay cả sau khi trì hoãn). Nhập một chữ cái thứ hai trong trường, lỗi! Lỗi EXC_BAD_ACCESS. Tôi cảm thấy như tôi ở gần đây. – r0ddy

+0

@ r0ddy Thật khó để nói vấn đề là gì, nhưng một khi bạn nhận được mọi thứ xếp hàng chính xác, cách tiếp cận này sẽ hoạt động như bạn muốn. –

0

Bạn có thể thử các cách sau

[self performSelector:<your selector> withObject:<object if you want to pass anything> afterDelay:<time delay>]; 

trong UITextField phương pháp đại biểu

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

Điều này sẽ chỉ trì hoãn mọi cập nhật thay vì trì hoãn mọi thứ cho đến khi người dùng nhập xong. –

+0

@ 0x7fffffff Ok. Hiểu sai lầm của tôi. Nó sẽ gọi bộ chọn nhiều lần. Tôi đồng ý đó là một câu trả lời sai. – Exploring

5

Với phương pháp timerWithTimeInterval: mục tiêu: selector: UserInfo: lặp đi lặp lại: bạn phải thêm bộ đếm thời gian để các runloop. Tôi cần thiết để chỉnh sửa câu trả lời như sau:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    if (someTimer.isValid) { 
     [someTimer invalidate]; 
    } 
    someTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeToSearchForStuff:) userInfo:nil repeats:NO]; 
    [[NSRunLoop mainRunLoop] addTimer:someTimer forMode:NSDefaultRunLoopMode]; 
    return YES; 
} 
Các vấn đề liên quan