2009-04-25 40 views
19

Tôi có một tiểu sử UIButton bên trong một UITableViewCell.Thay đổi trạng thái bị trì hoãn UIButton

Khi nút này được chạm, người dùng phải giữ nút trong khoảng nửa giây để hình ảnh của nút thay đổi thành hình ảnh UIControlStateHighlighted.

Điều này có nghĩa là nếu người dùng chỉ chạm vào nút như thường như vậy, trạng thái được đánh dấu sẽ không bao giờ được hiển thị.

Tại sao điều này xảy ra và làm cách nào để khắc phục sự cố?

+0

Hết sức tò mò, đây có phải là trong Trình mô phỏng hoặc trên thiết bị không? –

Trả lời

0

Chỉnh sửa: hoàn toàn viết lại sau một sự hiểu lầm của câu hỏi

Một cách suy nghĩ của một UIButton là như một cách viết tắt của thiết lập một khu vực của màn hình có thể đáp ứng với nhiều sự kiện liên lạc ngay lập tức phản ứng nó tạo ra được định nghĩa bởi hệ thống Target-Action của UIControl để truyền thông điệp tới các đối tượng khác.

UIControlEventTouchDown có vẻ như bạn cần phản hồi. Nó sẽ được kích hoạt ngay sau khi ai đó chạm vào bên trong nút của bạn - đây là nút "Thông tin liên hệ" trong SMS.

UIButton * myButton = [[Nút UIButtonWithType: UIButtonTypeRoundedRect]; // SEt lên tiêu đề, khung, v.v. [myButton addTarget: tự hành động: @selector (myButtonWasPressed) forControlEvents: UIControlEventTouchDown]; [myMainView addSubView: myButton];

Sẽ gửi một thông báo -(void)myButtonWasPressed đến đối tượng mà mã này chạy từ (lý tưởng bạn xem bộ điều khiển). Trong myButtonWasPressed, bạn có thể thêm chế độ xem mới hoặc thực hiện bất kỳ hành động nào bạn thích. Ứng dụng SMS đẩy bộ điều khiển chế độ xem để hiển thị thông tin liên hệ bằng bộ điều khiển điều hướng.

Nếu điều này vẫn không giải quyết được vấn đề của bạn, bạn sẽ phải đăng một số mã để hiểu rõ hơn về những gì đang xảy ra.

+0

Tôi nghĩ bạn hiểu lầm. Ví dụ: nếu bạn nhìn vào ứng dụng SMS, các biểu tượng ở trên cùng của chuỗi tin nhắn sẽ phản ứng ngay lập tức. Tôi nói rằng các nút của tôi không hiển thị phản ứng tức thời với trạng thái được đánh dấu. Tôi không muốn người dùng giữ nút. Tôi muốn họ sử dụng nút thông thường nhưng có trạng thái nút thay đổi và được phản ánh trong giao diện trực quan của nút, như mong đợi. –

+0

OK vẫn còn một sự hiểu lầm :). Không có gì sai với các hành động hoặc sự kiện của nút của tôi. Để tạo lại những gì tôi mô tả chỉ cần tạo một UITableViewCell mới và thêm UIButton làm phần phụ của nó: tức là [cell.contentView addSubview: button]. Sau đó kiểm tra nó trên thiết bị. Khi bạn chạm vào nút, hành động sẽ kích hoạt chính xác, tuy nhiên trạng thái được đánh dấu của nút không xảy ra ngay lập tức. Thay vào đó, bạn phải giữ nút này trong nửa giây trước khi bạn thấy nút * trực quan * thay đổi trạng thái. Tất cả những gì tôi nói đến là hình ảnh trực quan của nút. –

10

Vấn đề là UIButton của bạn nằm trong UITableView. Điều này có nghĩa là chế độ xem bảng phải xác định xem thao tác nhấn của bạn có phải là vuốt hay nếu đó chỉ là một lần nhấn dành cho nút. Chế độ xem bảng phải trì hoãn việc gửi thư đến UIButton cho đến khi biết rằng người dùng không có ý định vuốt và do đó cuộn chế độ xem thay vì nhấn nút.

Nếu bạn không cần chế độ xem bảng, hãy loại bỏ UITableView.

+0

Tôi cũng thấy điều này và vấn đề duy nhất của tôi với nhận xét này là sử dụng một điều khiển khác chẳng hạn như UISwitch không tạo ra độ trễ như vậy. – d2burke

3

tôi chỉ cần thay đổi hình ảnh từ bên trong phương thức hành động mục tiêu:

[sender setBackgroundImage:[UIImage imageNamed:@"highlighted-image.png"] forState:UIControlStateNormal]; 

Nó thay đổi hình nền ngay lập tức.

+0

nó hoạt động, cảm ơn bạn! –

25

Tôi vừa gặp sự cố này và thấy rằng vấn đề này đã không bị đóng. Sau khi vặn vẹo xung quanh trong một thời gian tôi tìm thấy một sửa chữa cho nó.

Bây giờ bạn có thể khắc phục điều này bằng cách tắt sự chậm trễContentTouches hoặc bỏ chọn hộp "Nội dung trễ chạm" trên bảng nhìn.

Tác dụng phụ tiêu cực duy nhất là người dùng sẽ không thể nhấn vào nút và bắt đầu cử chỉ cuộn. Tuy nhiên, nếu người dùng cố gắng di chuyển bắt đầu từ bất cứ nơi nào mà bản thân nó không chấp nhận chạm, thì hành vi phải giống như trước đây.

+0

Tôi đã dành 8 giờ để tìm ra giải pháp cho việc này. Cảm ơn bạn rất nhiều. – maxhud

+0

Tôi đã có cùng một vấn đề với một UIButton trên một scrollview. Điều này cố định nó. –

+0

Điều này làm việc cho tôi, cảm ơn. –

10

Trả lời câu trả lời của David Hodge.

Tôi chỉ muốn thêm một cách để loại bỏ "chỉ tác dụng phụ tiêu cực", đã được mô tả bởi David: nếu bạn bắt đầu cuộn bên trong một UIcontrol trong UIScrollView với delayContentTouches = NO, cuộn không hoạt động.

SOLUTION Subclass UIScrollView (hoặc UITableView như câu hỏi ban đầu) và ghi đè:

-(BOOL) touchesShouldCancelInContentView:(UIView *)view { 
return YES; 
} 

UIControls của bạn bên trong UIScrollView/UITableView sẽ thay đổi trạng thái của họ ngay lập tức trên máy và scrollviews sẽ có thể di chuyển thậm chí nếu chạm vào bắt đầu trên một số UIControl. Làm việc như một say mê.

+0

Không bao giờ được gọi. –

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