Xử lý sự kiện chạm trong UILabel và kết nối nó với IBAction


101

Được rồi, vậy là tôi đã UILabeltạo trong trình tạo giao diện hiển thị một số văn bản mặc định của "nhấn để bắt đầu".

Khi người dùng nhấn vào biểu tượng UILabelTôi muốn nó sẽ kích hoạt phương thức IBAction: phương thức -(IBAction)next;này cập nhật văn bản trên nhãn để nói điều gì đó mới.
Sẽ thực sự thuận tiện nếu điều này cho phép tôi chỉ cần kéo một kết nối từ phương thức của tôi đến nhãn của tôi và sau đó chọn chạm lên bên trong, như với một nút. nhưng than ôi, không có xì gà.

Vì vậy, dù sao, tôi đoán câu hỏi của tôi là, tôi sẽ phải phân lớp UILabelđể làm cho nó hoạt động? Hoặc có cách nào đó để tôi có thể kéo một nút qua nhãn, nhưng làm cho nó mờ 0%. Hoặc là có một giải pháp đơn giản hơn mà tôi đang thiếu?

Câu trả lời:


255

Kiểm tra nó ra:

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

Bí quyết là kích hoạt tương tác của người dùng.


1
Điều gì xảy ra nếu tôi có nhiều nhãn? làm thế nào tôi có thể phân biệt cái nào đã được khai thác?
người học

1
@learner hãy thử thuộc tính thẻ. đảm bảo sử dụng labelTap: thay vì labelTap. và sử dụng - (void) labelTap: (id) sender ;.
thedjaney

1
@thedjaney Người gửi là UITapGestureRecognizer, không phải UILabel
h4labs 10/02/15

TapGestureRecognizer không giống như chạm vào bên trong và mất khả năng tiếp cận và tuân thủ giao diện của con người.

1
@ h4labs bạn có thể sử dụng UITapGestureRecognizer * tapGesture = sender; sau đó nhận thẻ nhãn với tapGesture.view.tag
DJTano

70

UILabel kế thừa từ UIView kế thừa từ UIResponder. Tất cả các đối tượng UIresponder có thể xử lý các sự kiện cảm ứng. Vì vậy, trong tệp lớp của bạn mà biết về chế độ xem của bạn (có chứa UIlabel), hãy triển khai:

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;

Trong trình tạo giao diện, hãy đặt giá trị thẻ của UILabel. khi các lần chạm xảy ra trong phương thức TouchBegan của bạn, hãy kiểm tra giá trị thẻ của chế độ xem mà thẻ thuộc về:

UITouch *touch = [touches anyObject];

if(touch.view.tag == MY_TAG_VAL)
label.text = @"new text";

Bạn kết nối mã trong tệp lớp của mình với đối tượng UILabel trong trình tạo giao diện bằng cách khai báo biến cá thể UILabel của bạn với tiền tố IBOutlet:

IBOutlet UILabel *label;

Sau đó, trong trình tạo giao diện, bạn có thể kết nối chúng với nhau.


31
Một lưu ý, bạn phải đảm bảo rằng bạn đã chọn "User Interaction Enabled" trong trình tạo giao diện, nếu không điều này sẽ không hoạt động.
midas06,

Tôi gặp một vấn đề với phương pháp này. Nó hoạt động tốt khi bộ điều khiển chế độ xem được tải trực tiếp, nhưng khi tôi tạo bộ điều khiển nav, đẩy bộ điều khiển có chứa nhãn vào bộ điều khiển nav và sau đó hiển thị nó, các lần chạm dường như không truy cập được nhãn nữa. Bất kỳ ý tưởng?
midas06,

nếu đó là cùng một lớp điều khiển chế độ xem mà bạn đang đẩy thì nó sẽ hoạt động. âm thanh như có thể có một số vấn đề nhỏ khác. có thể bắt đầu một câu hỏi khác và đăng một số mã
Remover

5
Một phương pháp tương tự không yêu cầu thẻ là chỉ cần kiểm tra xem touch.view có bằng với ổ cắm bạn đặt cho nhãn hay không. Tôi thích điều này hơn, vì nó có nghĩa là tôi không phải theo dõi các thẻ.
Chống phân mảnh

giải pháp tuyệt vời. Tôi khuyên bạn không nên đặt bất kỳ thẻ nào thành 0 vì nhấp vào bất kỳ nơi nào khác có giá trị thẻ là 0. Điều này là do chế độ xem của bạn rất có thể sẽ có giá trị thẻ là 0. Nếu không, bạn có thể đặt thẻ của chế độ xem của mình thành cái gì đó như -1 và sau đó bạn có thể sử dụng giá trị thẻ từ 0 ở một nơi khác tức là một nút
kevinl

30

Bạn có thể sử dụng UIButton, làm cho nó trong suốt, tức là kiểu tùy chỉnh không có hình ảnh và thêm UILabel trên đó (căn giữa). Sau đó lên dây các sự kiện nút bình thường.


Tôi đồng ý, loại nút tùy chỉnh sẽ cung cấp cho bạn trải nghiệm người dùng loại Nhãn.
stitz

2
+1, tốt và đơn giản. Tôi đã thử điều này trước đây bằng cách đặt nút bình thường thành opactiy 0 không hoạt động, nhưng mẹo để thay đổi loại thành tùy chỉnh hoạt động hoàn hảo.
Brian Moeskau

Độ mờ đục sẽ ảnh hưởng đến nút và tất cả các chế độ xem phụ của nó, vì vậy độ mờ đục = 0 sẽ làm cho toàn bộ mọi thứ trở nên vô hình.
Eiko

10
Rất tiếc. Đây là một hack so với các giải pháp khác trong chủ đề này. Sử dụng trình nhận dạng cử chỉ nhấn trên nhãn nếu bạn muốn nhận dạng cử chỉ nhấn trên nhãn. (Xem cách nó đọc như nó đã được có nghĩa là cho điều này?)
James Boutcher

Đây là một giải pháp tốt hơn rất nhiều vì các nút xử lý mặt cảm ứng thay vì chỉ chạm (bắt đầu).

17

Swift 3

Bạn có IBOutlet

@IBOutlet var label: UILabel!

Trong đó bạn bật tương tác người dùng và thêm công cụ nhận dạng cử chỉ

label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
label.addGestureRecognizer(tapGesture)

Và cuối cùng, xử lý vòi

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) {
  // Your code goes here
}

2
Tôi đã phải thêm @objc vào userDidTapLabel để cái này hoạt động. Có thể là một điều 4 nhanh chóng.
Tuân theo POSIX
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.