2011-08-14 27 views
8

Ứng dụng của tôi có tùy chỉnh UITableView. Trong phương thức ủy nhiệm cellForRowAtIndexPath của UIViewController Tôi đang tạo đối tượng tùy chỉnh UITableViewCell đối tượng chứa nhiều UIL tùy chỉnh (thực tế là một lớp con của OHAttributedLabel) làm các bản xem phụ của chế độ xem nội dung.Làm cách nào để xử lý sự kiện chạm trên UILabel dưới dạng subview của UITableViewCell?

Tôi đã thử đặt userInteractionEnabled = YES trên nhãn, sau đó thêm các sự kiện chạm vào trong trình điều khiển chế độ xem, nhưng điều đó không hoạt động.

Ý tưởng?

Cảm ơn

+0

Chính xác thì không hoạt động? Bạn đã kiểm tra xem bạn đã có chế độ xem phù hợp trong thói quen chạm của mình chưa? – Mundi

+0

Không có gì để kiểm tra vì các phương pháp chạm không bao giờ bị trúng. – Bama91

Trả lời

12
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
     UITouch *touch = [[event allTouches] anyObject]; 
     if (CGRectContainsPoint([self.site frame], [touch locationInView:self.view])){ 
     //do whatever you want 
    } 
} 

Hoặc

UILabel *label = =[UILabel alloc]init]; 
label.userInteractionEnabled = YES; 
UITapGestureRecognizer *tapGesture = 
[[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTap)]  autorelease]; 
[label addGestureRecognizer:tapGesture]; 
+0

Đối với đề xuất đầu tiên của bạn ... Tôi đã thêm chạm vàoBegan và chạm vàoCác sự kiện được sắp xếp cho cả lớp con UILabel của tôi và cũng cho bộ điều khiển chế độ xem gốc, nhưng mã không bao giờ được nhấn khi tôi chạm vào nhãn (thuộc tính userInteractionEnabled được đặt thành CÓ trên nhãn tùy chỉnh của tôi). Tôi không chắc chắn những gì tôi đang mất tích. – Bama91

+0

@ Bama91 Tôi không biết tại sao chạm vào sự kiện là không gọi điện thoại tôi nghĩ rằng một số điều worng bạn did.Okay bất kỳ cách nào bạn đã thử đề nghị thứ hai của tôi? Thay vì UILabel * label = = [UILabel alloc] init]; bạn cần tạo với nhãn lớp tùy chỉnh của mình và thêm trình nhận dạng cử chỉ. –

+0

Tệ của tôi. Một vài tháng trở lại trong khi thử nghiệm tôi đã thiết lập "userInteractionEnabled = NO" trong phương thức initWithStyle của cha mẹ UITableViewCell. Sau khi nhận xét rằng, các sự kiện liên lạc đang hoạt động như mong đợi. Ngoài ra, tôi thấy rằng OHAttributedLabel đã xử lý các sự kiện liên lạc vì vậy tôi cần phải biết điều đó trong lớp con của tôi. – Bama91

1

Một UILabel không phải là một UIControl vì vậy bạn sẽ không nhận được sự kiện trên UIControlEventTouchUpInside hoặc tương đương. Tại sao không sử dụng nút thay thế? Bạn có thể làm cho nó trông giống hệt như một nhãn.

Bất kể bạn có thể sẽ cần phải đặt addTarget: action: forControlEvents: và gắn thẻ trên UIButton trong phương thức cellForRowAtIndexPath: của bạn. Trong phương thức đó, phát hiện nút nào của ô được khai thác bằng cách kiểm tra giá trị thẻ.

Nếu bạn phải sử dụng UILabel thì bạn cần phải phân lớp nó và chặn các chạm chạmBegan/touchesCác phương thức được thừa kế (kế thừa từ UIResponder) để phát hiện UIControlEventTouchUpInside.

+0

Tôi đang sử dụng một lớp con của OHAttributedLabel mà chính nó là một phân lớp của UILabel và thêm khả năng văn bản được phân bổ. Như đã đề cập trong bình luận của tôi ở trên, touchesBegan và touchesCác phương thức được thêm vào lớp con của tôi không bao giờ được nhấn khi nhãn được chạm vào. – Bama91

0

Tôi không biết liệu đó có phải là vấn đề tương tự hay không ... Tôi đã thêm nhãn và không thể nhận ra một liên lạc, cuối cùng tôi nhận ra rằng đó là vì tôi đã thêm nó dưới dạng một chế độ xem phụ, nhưng khung nằm ngoài khung của cha mẹ, do đó chế độ thừa kế đã chạm vào

1

Sự cố trong OHAttributedLabel. Nhãn này cũng xử lý nhấn vào liên kết. Vì vậy, để xử lý nhấn vào bất kỳ điểm nào của nhãn (không chỉ liên kết), bạn phải

self.textLabel.onlyCatchTouchesOnLinks = NO; 

Nơi self.textLabel là OHAttributedLabel của bạn. Và đừng quên userInteractionEnabled.

0

Tôi vừa gặp sự cố khi sử dụng các ô bảng tĩnh cho bảng cài đặt nơi tôi muốn toàn bộ ô kích hoạt trả lời đầu tiên cho trường văn bản của ô.

Tôi đã kết thúc thêm nút trong suốt (tùy chỉnh, tiêu đề trống) phía sau nhãn (chạm bị vô hiệu hóa) và trường văn bản sau khi không nhận được bất kỳ chạm nào khi sử dụng trình nhận dạng cử chỉ. Tôi nghĩ rằng nó sẽ làm việc một cách thanh lịch hơn, nhưng nó đã giải quyết được nhiệm vụ hiện tại và mục đích hạn chế đó. (và bạn chỉ có thể kéo kết nối từ hành động mặc định của nút)

Bit xấu xí. Sau đó, một lần nữa, nó chỉ mô tả khu vực phía sau trường văn bản phản ứng để chạm vào. Đó là ý định sau tất cả. Vì vậy, có lẽ nó chỉ là không ưa thích.

Sẽ giữ nó cho đến khi tôi tìm thấy lý do cho người nhận dạng không kích hoạt.

0

bạn có thể sử dụng TTTAttributedLabel để thay thế. nó rất dễ. khi bạn tắt vào UITableViewCell, bạn có thể ủy: TTTAttributedLabelDelegate như:

@interface MyTableViewCell : UITableViewCell<TTTAttributedLabelDelegate>{ 
    UILabel *nameLabel; 
    TTTAttributedLabel *valueLabel; 
} 

khi bạn ban đầu, bạn có thể thêm liên kết đến nhãn:

[valueLabel addLinkToPhoneNumber:valueStr withRange:NSMakeRange(0, valueStr.length)]; 

như vậy, bạn có thể làm bất cứ điều gì bạn muốn:

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithPhoneNumber:(NSString *)phoneNumber{ 
    //do anything you want. 

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