A içindeki bir satıra dokunduğunuzda UITableView
, satır vurgulanır ve seçilir. Bunu devre dışı bırakmak mümkün mü, böylece bir satıra dokunmak hiçbir şey yapmıyor mu?
A içindeki bir satıra dokunduğunuzda UITableView
, satır vurgulanır ve seçilir. Bunu devre dışı bırakmak mümkün mü, böylece bir satıra dokunmak hiçbir şey yapmıyor mu?
Yanıtlar:
Benim için aşağıdakiler işe yaradı:
tableView.allowsSelection = false
Bu, didSelectRowAt#
işe yaramayacağı anlamına gelir . Yani, tablonun bir satırına dokunmak, kesinlikle hiçbir şey yapmaz. (Ve dolayısıyla, açıkçası, asla seçilmiş bir animasyon olmayacaktır.)
(Hücrelerde, UIButton
veya başka denetimleriniz varsa, elbette bu denetimlerin hala çalışacağını unutmayın. Tablo hücresinde sahip olduğunuz tüm denetimler, UITableView'un "bir satır seçmenize" izin verme yeteneğiyle tamamen ilgisizdir. kullanarak didSelectRowAt#
.)
Dikkat edilmesi gereken bir diğer nokta şudur: UITableView
Düzenleme modundayken bu çalışmaz . Düzenleme modunda hücre seçimini kısıtlamak için kodu aşağıdaki gibi kullanın:
tableView.allowsSelectionDuringEditing = false
selectionStyle
Özelliği hücrede ayarlamanız gerekir : cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift veya cell.selectionStyle = UITableViewCellSelectionStyleNone
Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
çağrılacak, cell.selectionStyle = .None
arzu edilir. Bu temsilci işlevinin (yani bir tableViewCell'de bir metin alanına sahip olması) çağrılmasını istemiyorsanız ya da ilgilenmiyorsanız tableView.allowsSelection = false
gayet iyi.
Tek yapmanız gereken, UITableViewCell
örnek üzerinde seçim stilini aşağıdakilerden birini kullanarak ayarlamaktır :
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
veya
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Hızlı 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 ve 4.x:
cell.selectionStyle = .none
Ayrıca, -tableView:didSelectRowAtIndexPath:
tablo görünümü temsilcinize uygulamadığınızdan emin olun ya da uygularsanız herhangi bir işlem yapmak istemediğiniz hücreleri açıkça dışlayın.
Bu yazıyı son zamanlarda okuduğum ve bana yardımcı olduğu için, tüm cevapları birleştirmek için başka bir cevap yayınlamak istedim (gelecek için).
Yani, istediğiniz mantığa ve / veya sonuca bağlı olarak aslında 5 farklı cevap vardır:
Hücrenin başka bir etkileşimini değiştirmeden mavi vurgulamayı devre dışı bırakmak için:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Ben bir UIBableViewCell barındırılan bir UIButton - veya başka bir kontrol (ler) var ve ben kullanıcı kontrolleri ile etkileşim ancak hücrenin kendisi için etkileşim istiyorum istiyorum.
NOT : Tony Million'un yukarıda belirttiği gibi, bu engellemeztableView:didSelectRowAtIndexPath:
. Bunu basitçe "if" ifadeleriyle hallederim, çoğunlukla bölümü test eder ve belirli bir bölüm için eylemden kaçınırım.
Böyle bir hücrenin tıkanmasını test etmeyi düşündüğüm başka bir yol:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// A case was selected, so push into the CaseDetailViewController
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
// Handle tap code here
}
}
Tüm bir tablo için bunu yapmak için, yukarıdaki çözümü tablodaki her hücreye uygulayabilirsiniz, ancak bunu da yapabilirsiniz:
[tableView setAllowsSelection:NO];
Testlerimde, bu hala içindeki kontrollerin UITableViewCell
etkileşimli olmasına izin veriyor .
Bir hücreyi "salt okunur" hale getirmek için şunları yapabilirsiniz:
[cell setUserInteractionEnabled:NO];
4.Tüm bir tabloyu "salt okunur" yapmak
[tableView setUserInteractionEnabled:NO];
5.Bir hücrenin vurgulanıp vurgulanmayacağını belirlemek için ( bu cevaba göre dolaylı olarak seçimi içerir), aşağıdaki UITableViewDelegate
protokol yöntemini uygulayabilirsiniz :
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
tableView:shouldHighlightRowAtIndexPath:
, genellikle (her zaman değil) tercih ettiğim yaklaşım olan bir not ekleyin .
Neyi düşündüğümü özetlemek gerekirse, bunu uygulama konusundaki kendi deneyimime dayalı doğru cevaplar:
Yalnızca bazı hücreler için seçimi devre dışı bırakmak istiyorsanız, şunu kullanın:
cell.userInteractionEnabled = NO;
Seçimi engellemenin yanı sıra, bu ayarlanmış hücreler için tableView: didSelectRowAtIndexPath: çağrılmasını da durdurur. (Bu cevap için kredi Tony Million'a gidiyor, teşekkürler!)
Hücrelerinizde tıklanması gereken düğmeler varsa bunun yerine şunları yapmanız gerekir:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
ve içindeki hücredeki tıklamaları da yok saymanız gerekir - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.
Tüm tablo için seçimi devre dışı bırakmak istiyorsanız, şunu kullanın:
tableView.allowsSelection = NO;
(Paulo De Barros'a teşekkür ederiz, teşekkürler!)
İOS 6.0 itibariyle UITableViewDelegate
vardır tableView:shouldHighlightRowAtIndexPath:
. (İOS Belgeleri'nde bu konuyla ilgili bilgi edinin .)
Bu yöntem, bir hücrenin seçim stilini değiştirmek, hücrenin olay işlemesi userInteractionEnabled = NO
veya burada belgelenen diğer tekniklerle uğraşmak zorunda kalmadan belirli satırları vurgulanamaz (ve dolaylı olarak seçilemez) olarak işaretlemenizi sağlar .
Sen seçerek kendisini inşaatçı arayüzünden sıranın devre dışı seçimi de can NoSelection
dan selection
aşağıdaki resimde gösterildiği gibi müfettiş bölmesinde (UITableView Özelliklerinin) seçeneğiyle
SWIFT 3 İÇİN SABİT ÇÖZÜM
cell.selectionStyle = .none
Seçimin yalnızca yanıp sönmesini istiyorsanız, seçilen durumda kalmazsanız,
didSelectRowAtIndexPath
aşağıdaki
[tableView deselectRowAtIndexPath:indexPath animated:YES];
böylece seçilen durumu yanıp söner ve geri döner.
Herkesin Swift için cevaba ihtiyacı olması durumunda :
cell.selectionStyle = .None
Bu cellForRowAtIndexPath
kodu yazarken kullandığım budur . :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Gönderen UITableViewDelegate
Protokol Eğer yöntemi kullanabilirsiniz willSelectRowAtIndexPath
ve return nil
sen satır seçili istemiyorsanız.
Aynı şekilde, willDeselectRowAtIndexPath
yöntemi kullanabilirsiniz ve return nil
satırın seçimini yapmak istemiyorsanız.
1- Tek yapmanız gereken ,UITableViewCell
örnek üzerinde seçim stilini aşağıdakilerden birini kullanarak ayarlamaktır :
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
veya
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Hızlı 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Hızlı 3:
cell.selectionStyle = .none
2 - Uygulamayın - tableView:didSelectRowAtIndexPath:
tablo görünümünüzde delegate
, eylemde bulunmasını istediğiniz hücreleri uygularsanız veya açıkça hariç tutarsanız.
3 - Ayrıca, film şeridinden de yapabilirsiniz. Tablo görünümü hücresini tıklatın ve Tablo Görünümü Hücresi altındaki özellikler denetçisinde, Seçim'in yanındaki açılır listeyi Yok olarak değiştirin.
4 - (iOS) Xcode 9, Swift 4.0'daki aşağıdaki kodu kullanarak tablo hücresi vurgulamasını devre dışı bırakabilirsiniz
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
Snippet'in altında vurgulamayı devre dışı bırakın ancak aynı zamanda çağrıyı da devre dışı bırakır didSelectRowAtIndexPath
. Yani uygulama yapmıyorsanız, didSelectRowAtIndexPath
aşağıdaki yöntemi kullanın. Bu, tablo oluştururken eklenmelidir. Bu düğmeler ve UITextField
hücre içinde çalışacaktır .
self.tableView.allowsSelection = NO;
Snippet'in altında vurgulamayı devre dışı bırakın ve adresine yapılan çağrıyı devre dışı bırakmaz didSelectRowAtIndexPath
. Hücrenin seçim stilini Yok'ta olarak ayarlayıncellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Snippet'in altındaki hücredeki her şeyi devre dışı bırakın. Bu kadar etkileşimi devre dışı bırakacak buttons
, textfields
:
self.tableView.userInteractionEnabled = false;
Swift
Yukarıdaki Objective-C
çözümlerin eşdeğeri aşağıdadır :
İlk Çözümün Değiştirilmesi
self.tableView.allowsSelection = false
İkinci Çözeltinin Değiştirilmesi
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Üçüncü Çözümün Değiştirilmesi
self.tableView.userInteractionEnabled = false
Yazmaya çalışın:
cell.selected = NO;
Gerektiğinde satırınızın seçimini kaldıracaktır.
Swift3'te ...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let r = indexPath.row
print("clicked .. \(r)")
tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}
Ben bununla oldukça bolca mücadele ettim UITableViewCell
, userInteractionEnabled
mülk kullanımımın kontrolünde olması . Ben ayarları için 3 hücreli statik tablo var, tarihleri 2, bir açma / kapama düğmesi ile 1. Storyboard / IB'de oynadıktan sonra, alt kısmı seçilemez hale getirmeyi başardım, ancak dokunduğunuzda üst sıralardan birindeki seçim kaybolur. İşte UITableView ayarlarımın WIP görüntüsü:
3. satıra dokunursanız hiçbir şey olmaz, seçim ikinci satırda kalır. Bu işlevsellik, Apple'ın Takvim uygulamasının etkinlik zamanı ekle seçim ekranının bir kopyasıdır.
Kod şaşırtıcı derecede uyumludur, IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
Bu, seçim stilini hiçbiri olarak ayarlamamayla birlikte çalışır, bu nedenle hücre, dokunma olaylarında titremez
Bu kodu cellForRowAtIndexPath içine koymanız yeterli
Hücrenin seçim özelliğini devre dışı bırakmak için: (Hücreye dokunurken).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Benim için çalışan bunu kullanıyorum.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Bu, bir satırın seçim sırasında vurgulamayı göstermesini önlemek için en iyi ve en kolay çözüm olsa da
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ayrıca, satırın kısa bir süre için seçildiğini ve sonra kapatıldığını göstermenin bazen yararlı olduğunu da belirtmek isterim. Bu, kullanıcıları seçmek istediklerinin bir onayı ile uyarır:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Kullanmak UITableViewCellSelectionStyleNone
istemiyorsanız / kullanamamanız durumunda aynı efekti elde etmek için arka plan rengini Temizle olarak da ayarlayabilirsiniz UITableViewCellSelectionStyleNone
.
Aşağıdaki gibi bir kod kullanırsınız:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Bu, her hücreye fazladan renkli bir görünüm ekledikçe performansınızı düşürebilir .
Kullanabilirsiniz :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableView'ınızın dizin yolu yöntemindeki satır hücresinde.
Ayrıca şunları kullanabilirsiniz:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
Tablo görünümünde didselectrowatindexpath yöntemi.
cell.selectionStyle = UITableViewCellSelectionStyle.none
Swift 3'te.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Mutlu kodlama !!!
selection
ve elbettehighlighting
bununla devre dışı bırakılıyor. Yüksek oyu alan birçok yanıtdisable selection
, devre dışı bırakmanın nasıl yapılacağını ve ele alınmadığını açıklarhighlighting
. Yalnızca vurgulamayı kullanmak için devre dışıcell.selectionStyle = .None
bırakın veyastoryboard / cell / Selection = None