UILabel'de Dokunma Olayını işleme ve bir IBAction'a bağlama


101

Tamam, UILabelbazı varsayılan "başlamak için dokunun" metnini görüntüleyen bir arayüz oluşturucum var.

Kullanıcı UILabeldüğmesine dokunduğunda, -(IBAction)next;yeni bir şey söylemek için etiketteki metni güncelleyen bir IBAction yöntemini tetiklemesini istiyorum .
Bu, bir bağlantıyı yöntemimden etiketime sürüklememe ve ardından bir düğmeyle olduğu gibi içeride rötuş yapmama izin verseydi gerçekten uygun olurdu. ama ne yazık ki puro yok.

her neyse, sanırım sorum şu, UILabelbunun işe yaraması için alt sınıfa gitmem gerekecek mi? Veya bir düğmeyi etiketin üzerine sürükleyip% 0 opak yapmamın bir yolu var mı? Yoksa özlediğim daha basit bir çözüm mü var?

Yanıtlar:


255

Bunu kontrol et:

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

İşin püf noktası, kullanıcı etkileşimini sağlamaktır.


1
Ya birden fazla etiketim varsa? hangisinin tıklandığını nasıl ayırt edebilirim?
öğrenci

1
@learner tag özelliğini deneyin. labelTap yerine labelTap: kullandığınızdan emin olun. ve - (void) labelTap: (id) gönderen;
thedjaney

1
@thedjaney Gönderen, UILabel değil,
UITapGestureRecognizer'dır

TapGestureRecognizer, içerideki rötuşla aynı değildir ve insan arayüzü uyumluluğunu ve erişilebilirliğini kaybeder.

1
@ h4labs UITapGestureRecognizer'ı kullanabilirsiniz * tapGesture = gönderen; ardından tapGesture.view.tag ile etiket etiketini alın
DJTano

70

UILabel, UIResponder'dan devralan UIView'den miras alır. Tüm UIresponder nesneleri dokunma olaylarını yönetebilir. Dolayısıyla, (UIlabel içeren) görünümünüzü bilen sınıf dosyanızda şunları uygulayın:

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

Arayüz oluşturucuda UILabel'in etiket değerini ayarlayın. touchesBegan yönteminde dokunuşlar meydana geldiğinde, etiketin ait olduğu görünümün etiket değerini kontrol edin:

UITouch *touch = [touches anyObject];

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

UILabel örnek değişkeninizi IBOutlet öneki ile bildirerek, arayüz oluşturucudaki UILabel nesnesiyle sınıf dosyanızdaki kodunuzu bağlarsınız:

IBOutlet UILabel *label;

Ardından arayüz oluşturucuda bunları bağlayabilirsiniz.


31
Bir not, arayüz oluşturucudaki "Kullanıcı Etkileşimi Etkin" seçeneğini işaretlediğinizden emin olmalısınız, yoksa bu işe yaramaz.
midas06

Bu yöntemle bir sorunu çözdüm. Görünüm denetleyicisi doğrudan yüklendiğinde iyi çalıştı, ancak bir gezinme denetleyicisi oluşturduğumda, etiketi içeren denetleyiciyi gezinme denetleyicisine itip ardından görüntülediğimde, dokunuşlar artık etikete ulaşmıyor gibi görünüyor. Herhangi bir fikir?
midas06

Eğer zorladığınız aynı görünüm denetleyicisi sınıfıysa çalışmalıdır. Sanki başka bir küçük sorun olabilir. belki başka bir soru başlatabilir ve biraz kod gönderebilirsiniz
Remover

5
Etiket gerektirmeyen benzer bir yöntem, touch.view'un etiket için ayarladığınız çıkışa eşit olup olmadığını kontrol etmektir. Bunu tercih ediyorum, çünkü etiketleri takip etmem gerekmiyor.
defragged

harika çözüm. Herhangi bir etiketi 0 olarak ayarlamamanızı tavsiye ederim çünkü başka herhangi bir yere tıklamanızın etiket değeri 0'dır. Bunun nedeni, görünümünüzün büyük olasılıkla 0 etiket değerine sahip olmasıdır. Aksi takdirde, görünümünüzün etiketini şu şekilde ayarlayabilirsiniz: -1 gibi bir şey ve sonra başka bir yerde 0'ın etiket değerini kullanabilirsiniz, yani bir düğme
kevinl

30

Bir UIButton kullanabilir, onu saydam yapabilir, yani bir görüntü olmadan özel tip yapabilir ve üzerine bir UILabel ekleyebilirsiniz (ortalanmış). Ardından normal düğme olaylarını bağlayın.


Kabul ediyorum, özel düğme türü size UILabel türü bir kullanıcı deneyimi sunmalıdır.
stitz

2
+1, güzel ve basit. Bunu daha önce çalışmayan opactiy 0'a normal bir düğme ayarlayarak denedim, ancak türü özel olarak değiştirmek için ipucu mükemmel çalıştı.
Brian Moeskau

Opaklık, düğmeyi ve tüm alt görünümlerini etkileyecektir, bu nedenle opaklık = 0, her şeyi görünmez hale getirecektir.
Eiko

10
Eyvah. Bu, bu konudaki diğer çözümlerle karşılaştırıldığında bir hack'tir. Bir etiketteki dokunma hareketini tanımak istiyorsanız, bir etiket üzerinde hafifçe vurma hareketi tanıyıcı kullanın. (Bunun için nasıl yapıldığını
gördün

Bu çok, çok daha iyi bir çözümdür çünkü düğmeler sadece dokunmaları (başla) değil, dokunmaları da ele alır.

17

Hızlı 3

IBOutlet'ınız var

@IBOutlet var label: UILabel!

Kullanıcı etkileşimini etkinleştirdiğiniz ve bir hareket tanıyıcı eklediğiniz

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

Ve son olarak musluğu halledin

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

2
Bunun işe yaraması için userDidTapLabel'e @objc eklemem gerekiyordu. Hızlı bir 4 şey olabilir.
POSIX uyumlu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.