2012-01-10 33 views
18

Tôi muốn trả lời các sự kiện chạm (cụ thể là UIControlEventTouchUpInsideUIControlEventTouchUpOutside) trên số UITextField, nhưng sự kiện duy nhất đi qua là UIControlEventTouchCancel.Làm cách nào tôi có thể phản hồi các sự kiện chạm trên UITextField?

Tôi không thể sử dụng UIControlEventEditingDidBegin, bởi vì nó chỉ xảy ra khi trường đạt tiêu điểm, đó không phải là những gì tôi đang cố gắng phát hiện. Tôi muốn biết khi nào người dùng nhấc ngón tay của họ lên và cho dù đó là bên trong hay bên ngoài trường văn bản, bất kể trạng thái lấy nét hiện tại là gì.

Có ai biết cách để thực hiện việc này không?

Để rõ ràng, tôi đã thử sử dụng addTarget:action:forControlEvents và nó không hoạt động. Sự kiện liên lạc bị ngăn cản bởi việc hủy bỏ. Tôi muốn một cách để phát hiện chạm lên trước khi số UITextField tiêu thụ và tạo sự kiện Hủy.

Ngoài ra, tôi muốn tránh tạo thêm bất kỳ chế độ xem nào nếu có thể.

Trả lời

-1

Thêm mục tiêu cho sự kiện mong muốn của bạn theo chương trình, hoặc sử dụng IB.

UITextField * touchyTextField = [[UITextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 21.0)]; 

[touchyTextField addTarget:self 
        action:@selector(yourDesiredMethod) 
      forControlEvents:UIControlEventTouchUpInside]; 
+7

Không, điều đó chắc chắn không hoạt động. Điều đầu tiên tôi đã thử. Phương thức "yourDesiredMethod" không bao giờ được gọi. Tôi có thể nhận các sự kiện cho UIControlEventTouchDown, nhưng cả sự kiện TouchUp đều không được kích hoạt. Thay vào đó, một sự kiện UIControlEventTouchCancel được kích hoạt. Tôi không thể sử dụng sự kiện đó làm proxy hack cho sự kiện mà tôi muốn, bởi vì nó cũng được kích hoạt khi báo chí kéo dài vòng phóng to và khi một thứ khác hủy đầu vào của người dùng như hộp thoại phương thức hoặc màn hình khóa . – theK42

+0

Wow, tôi cho rằng nó sẽ hoạt động giống như bất kỳ lớp học dựa trên UIView nào khác. Bạn có thể tạo UITextField tùy chỉnh và ghi đè phương thức touchesBegan: đảm bảo trở thành người trả lời đầu tiên trong các trường hợp thích hợp để bàn phím vẫn hiển thị. –

+0

Vì vậy, tôi đã cố gắng ghi đè quan trọngBan/Kết thúc/Hủy, và điều đó cũng đã cho tôi một cặp Bắt đầu/Hủy, không có sự kiện Kết thúc. Điều này thực sự bực bội! Ngoài ra, việc ghi đè các phương thức đó không ngăn cản textField trở thành người trả lời đầu tiên, vì vậy lớp cơ sở đang xử lý cảm ứng trước khi tôi có cơ hội! – theK42

4

Vâng một vòng về cách làm việc đó sẽ tạo ra một UIButton với điền thiết lập để xóa để trang trải tất cả các không gian, và một UITextField trên đầu trang của nó. Nếu người dùng chạm vào trường văn bản, trường văn bản sẽ gửi một sự kiện và nếu người dùng chạm vào bên ngoài trường văn bản, UIButton sẽ gửi sự kiện.

+0

Vì tôi không thể để sự kiện chạm vào bên trong TextField, điều này sẽ không hoạt động. Tôi cũng muốn tránh tạo thêm bất kỳ chế độ xem nào nếu có thể. – theK42

2

Tốt trả lời ở đây: Change default touch events for UITextField

Sử dụng đại biểu các trường văn bản và làm những gì bạn muốn làm trong textFieldShouldBeginEditing:

Bạn có thể trở NO để ngăn chặn hành vi mặc định.

+0

Đó không phải là thông tin vô ích, nó có thể giúp tôi đến gần hơn với hành vi mà tôi muốn. Nó không phải là một câu trả lời hoàn chỉnh mặc dù, vì nó không thể giúp tôi phát hiện các liên lạc bắt đầu bên trong và kết thúc bên ngoài lĩnh vực theo cách 'UIControlEventTouchUpOutside' sẽ. – theK42

+0

Tất nhiên. Tôi nên đọc câu hỏi của bạn một cách chính xác! – beev

+0

Một lời cảnh cáo ở đây. Phương pháp đó kích hoạt trong nhiều trường hợp hơn là chỉ cần nhấn, ví dụ khi nhấn tab trên bàn phím ngoài để duyệt các trường văn bản. Thử nghiệm trên iOS 9. –

0

Tôi đã gặp sự cố này ngay hôm nay. Mục tiêu của tôi là thay đổi màu nền của textfield khi chạm và hoàn nguyên trở lại khi chạm/hủy. Thật lạ khi chạm xuống được gửi đến mục tiêu từ UITextField, nhưng hãy chạm vào bên trong, chạm vào bên ngoài và thậm chí chạm vào hủy không được. Tôi đã tìm ra giải pháp. Nó đơn giản. Chỉ cần tạo một lớp con của UITextField và ghi đè các chạm chạmEnded: and touchesCancelled :.

@interface TextField : UITextField 

@end 

@implementation CuteTextField 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesEnded:touches withEvent:event]; 
    self.backgroundColor=GetDefaultBackgroundColor(); 
} 

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesCancelled:touches withEvent:event]; 
    self.backgroundColor=GetDefaultBackgroundColor(); 
} 

@end 
1

Bạn có thể tạo danh mục cho UiView và ghi đè chạm vào thịt thuần chay như sau.

Nó hoạt động tốt cho tôi. Và đó là giải pháp tập trung cho vấn đề này.

#import "UIView+Keyboard.h" 
@implementation UIView(Keyboard) 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.window endEditing:true]; 
    [super touchesBegan:touches withEvent:event]; 
} 


@end 
Các vấn đề liên quan