Câu hỏi Làm thế nào tôi có thể vô hiệu hóa lựa chọn UITableView làm nổi bật?


Khi bạn nhấn vào một hàng trong một UITableView, hàng được đánh dấu và chọn. Có thể vô hiệu hóa điều này để khai thác một hàng không có gì?


1076
2017-10-10 11:32


gốc


Câu hỏi ban đầu có một tiêu đề xấu. OP muốn chủ yếu là vô hiệu hóa selection, và dĩ nhiên highlighting bị vô hiệu hóa với điều đó. Nhiều câu trả lời bình chọn cao giải thích cách disable selectionvà không giải quyết việc vô hiệu hóa highlighting. Để tắt chỉ sử dụng làm nổi bật cell.selectionStyle = .None hoặc đi đến storyboard / cell / Selection = None - Andrej
Vui lòng cập nhật tiêu đề hoặc bài đăng. Tôi bối rối. Và dựa trên câu hỏi này, tôi không biết câu trả lời có ý nghĩa gì. - Dani Springer


Các câu trả lời:


Đối với tôi, những điều sau đây hoạt động tốt:

tableView.allowsSelection = NO;

Điều này có nghĩa là didSelectRowAt# chỉ đơn giản là sẽ không hoạt động. Đó là để nói, chạm vào một hàng của bảng, như vậy, sẽ làm hoàn toàn không có gì. (Và do đó, rõ ràng, sẽ không bao giờ là một hoạt ảnh được chọn.)

(Lưu ý rằng nếu, trên các ô, bạn có UIButton hoặc bất kỳ điều khiển nào khác, tất nhiên những điều khiển đó sẽ vẫn hoạt động. Bất kỳ điều khiển nào bạn gặp phải trên ô bảng, hoàn toàn không liên quan đến khả năng của UITableView để cho phép bạn "chọn một hàng" bằng cách sử dụng didSelectRowAt#.)


498
2017-07-22 16:56



điều này cuối cùng đã làm việc cho tôi, tôi đã cố gắng sử dụng cell.selectionStyle = UITableViewCellSelectionStyleNone; nhưng nó không hoạt động. Một điều cần lưu ý: nó phải là: tableView.allowsSelection = NO; không sai. - tony.tc.leung
Tôi nghĩ, đây là lựa chọn tốt nhất. Các nút trên các ô đang hoạt động với điều này, nhưng văn bản không hoạt động. - Fahim Parkar
Điều này cũng hoàn toàn vô hiệu hóa ô của bạn ... - Gil Sand
Câu trả lời được chấp nhận này như thế nào và có nhiều phiếu bầu này? Nó không trả lời câu hỏi chút nào! Bạn cần đặt selectionStyle thuộc tính trên ô: cell.selectionStyle = UITableViewCellSelectionStyle.None trong Swift, hoặc cell.selectionStyle = UITableViewCellSelectionStyleNone trong mục tiêu-C. - nodebase
Có một vài cách để làm điều này tùy thuộc vào những gì mong muốn. Không có kiểu lựa chọn nào và không có lựa chọn nào có thể làm việc cả, hoặc cả hai đều không thành công. Đây là một ví dụ. Nếu bạn muốn chọn ô và có tableViewDidSelectRowAtIndexPath được gọi là, cell.selectionStyle = .None khao khát. Nếu bạn không muốn hoặc quan tâm đến chức năng ủy nhiệm đó được gọi (tức là có một trường textfield trong một thiết lập tableViewCell) tableView.allowsSelection = false là tốt. - Made2k


Tất cả những gì bạn phải làm là đặt kiểu lựa chọn trên UITableViewCell ví dụ bằng cách sử dụng:

Mục tiêu-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

hoặc là

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3 và 4.x:

cell.selectionStyle = .none

Hơn nữa, hãy đảm bảo bạn không triển khai -tableView:didSelectRowAtIndexPath: trong bảng xem ủy nhiệm của bạn hoặc loại trừ rõ ràng các ô bạn muốn không có hành động nếu bạn thực hiện nó.

Thông tin thêm tại đây và đây


1830
2017-10-10 13:22



ARRRRRRRGH cách tốt hơn để làm điều đó là sử dụng cell.userInteractionEnabled = NO; mà sẽ không chỉ dừng lại các tế bào được highlighed nhưng cũng sẽ dừng lại rằng tế bào cụ thể kích hoạt một didSelectRowAtIndexPath ......... - Tony Million
@ Tony Đó là ý tưởng tồi nếu bạn có một UITextField bên trong tế bào. - Aniruddh Joshi
@TonyMillion nó cũng là một ý tưởng tồi nếu bạn muốn sử dụng các điều khiển chỉnh sửa trong xây dựng, chẳng hạn như vuốt để xóa. Nếu bạn đặt userInteractionEnabled thành NO thì nút xóa không phản hồi các sự kiện chạm của người dùng. - Carlos P
đến cuối chuỗi này, nhưng thay vì userInteraction, hãy sử dụng cell.allowsSelection. Điều đó dừng phương thức tương tác của ô nhưng không chặn nội dung trả lời thường xuyên của UIView. - Chris C
Tôi sẽ bỏ phiếu cho câu trả lời, nhưng chỉ để rõ ràng, OP hỏi chỉ để vô hiệu hóa "làm nổi bật", không để vô hiệu hóa toàn bộ tương tác với tế bào, vì vậy tất cả các bình luận này đều không chính xác. - Frederic Yesid Peña Sánchez


Bởi vì tôi đã đọc bài đăng này gần đây và nó đã giúp tôi, tôi muốn đăng một câu trả lời khác để củng cố tất cả các câu trả lời (cho hậu thế).



Vì vậy, có 5 câu trả lời khác nhau tùy thuộc vào logic và / hoặc kết quả mong muốn của bạn:

1.Để tắt đánh dấu màu xanh mà không thay đổi bất kỳ tương tác nào khác của ô:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Tôi sử dụng điều này khi tôi có một UIButton - hoặc một số điều khiển khác (s) - được lưu trữ trong một UITableViewCell và tôi muốn người dùng có thể tương tác với các điều khiển nhưng không phải là chính tế bào.

CHÚ THÍCH: Như Tony Million đã lưu ý ở trên, điều này KHÔNG ngăn tableView:didSelectRowAtIndexPath:. Tôi nhận được xung quanh này bằng cách đơn giản "nếu" báo cáo, thường xuyên nhất thử nghiệm cho phần và tránh hành động cho một phần cụ thể.

Một cách khác tôi nghĩ để thử nghiệm cho việc khai thác một tế bào như thế này là:

- (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
    }
}



2.Để thực hiện việc này cho toàn bộ bảng, bạn có thể áp dụng giải pháp trên cho mỗi ô trong bảng, nhưng bạn cũng có thể làm điều này:

[tableView setAllowsSelection:NO];

Trong thử nghiệm của tôi, điều này vẫn cho phép các điều khiển bên trong UITableViewCell tương tác.


3.Để tạo một ô "chỉ đọc", bạn chỉ cần làm điều này:

[cell setUserInteractionEnabled:NO];



4.Để tạo toàn bộ bảng "chỉ đọc"

[tableView setUserInteractionEnabled:NO];



5.để xác định on-the-fly cho dù để làm nổi bật một tế bào (mà theo câu trả lời này ngầm bao gồm lựa chọn), bạn có thể thực hiện như sau UITableViewDelegate phương thức giao thức:

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath

333
2018-06-10 11:08



Nếu bạn tải thiết kế ô từ một ngòi bút, hộp kiểm (trong IB) sẽ hoạt động tốt cho # 3 (và trên bảng cho # 4). Đối với # 4 so với # 2, sự khác biệt có hay không điều khiển bên trong ô sẽ tương tác? - lilbyrdie
Vâng. Nếu bạn muốn tắt lựa chọn nhưng cho phép UIButtons, v.v ... để tiếp tục hỗ trợ tương tác người dùng, hãy sử dụng # 2. Nếu bạn muốn một ô hoàn toàn chỉ đọc, hãy sử dụng # 4. Tất nhiên, tại sao bạn sẽ có bất cứ điều gì nhưng UIViews hoặc UILabels trong một tế bào không tương tác là ngoài tôi. Có lẽ ai đó sẽ muốn vô hiệu hóa tất cả các tương tác trong khi cái gì khác đang xảy ra. - mbm29414
# 4 là một ý tưởng khủng khiếp, làm điều này cũng sẽ vô hiệu hóa cuộn trong chế độ xem bảng - simon
@ simon Trên thực tế, nó không phải là một ý tưởng khủng khiếp; đó là một lựa chọn có thể hoặc không thể là một lựa chọn tốt tùy theo hoàn cảnh của bạn. Ngoài ra, # 4 vô hiệu hóa cuộn USER; bạn vẫn có thể thực hiện của riêng bạn, nếu cần thiết. Tôi đồng ý # 4 là không hữu ích MUCH, nhưng nó không phải là một ý tưởng khủng khiếp. - mbm29414
Để hoàn thành, bạn có thể thêm lời cảm ơn cho tableView:shouldHighlightRowAtIndexPath:, đó là nói chung là (không phải luôn luôn) cách tiếp cận ưa thích của tôi. - Benjohn


Tóm lại những gì tôi tin là những câu trả lời đúng dựa trên kinh nghiệm của chính tôi trong việc thực hiện điều này:

Nếu bạn muốn tắt lựa chọn cho một số ô, hãy sử dụng:

cell.userInteractionEnabled = NO;

Cũng như ngăn chặn việc lựa chọn, điều này cũng dừng tableView: didSelectRowAtIndexPath: được gọi cho các ô đã được thiết lập. (Tín dụng đi đến Tony Million cho câu trả lời này, cảm ơn!)

Nếu bạn có các nút trong các ô cần được nhấp, bạn cần phải thay thế:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

và bạn cũng cần bỏ qua bất kỳ nhấp chuột nào trên ô trong - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.

Nếu bạn muốn tắt lựa chọn cho toàn bộ bảng, hãy sử dụng:

tableView.allowsSelection = NO;

(Tín dụng cho Paulo De Barros, cảm ơn!)


75
2018-06-01 13:32



Nếu chúng ta có một nút trong ô của chúng ta thì sao? - Umair Afzal


Kể từ iOS 6.0, UITableViewDelegate có tableView:shouldHighlightRowAtIndexPath:. (Đọc về nó trong iOS Tài liệu.)

Phương thức này cho phép bạn đánh dấu các hàng cụ thể là không có ánh sáng (và ngầm, không thể chọn) mà không phải thay đổi kiểu lựa chọn của ô, làm rối loạn xử lý sự kiện của ô với userInteractionEnabled = NOhoặc bất kỳ kỹ thuật nào khác được ghi ở đây.


49
2017-10-31 21:48



Vượt qua chủ đề này và tôi đã bị sốc khi thấy rất nhiều câu trả lời khác trước câu trả lời này. Điều này là không có nghi ngờ một cách thích hợp. - beebcon
Đây thực sự là câu trả lời chính xác và duy nhất cần được xem xét. Bất cứ điều gì khác đề cập đến userInteraction là hoàn toàn không chính xác. - mattyohe


Bạn cũng có thể vô hiệu hóa lựa chọn hàng từ chính trình tạo giao diện bằng cách chọn NoSelection từ selection tùy chọn (thuộc tính UITableView) trong ngăn kiểm tra như thể hiện trong hình dưới đây

UITableView Inspector


45
2018-04-25 13:13



Giải pháp tốt nhất IMHO - Itai Spector
Tôi thường sử dụng giải pháp này - Evsenev


GIẢI PHÁP CỐ ĐỊNH CHO SWIFT 3 

cell.selectionStyle = .none

42
2018-01-07 19:15



điều này có vẻ như là một câu trả lời tốt hơn nhiều so với lựa chọn ... - LIAM BOLLING