Làm cách nào tôi có thể tắt lựa chọn UITableView?


1193

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


17
Câu hỏi ban đầu có một tiêu đề xấu. OP muốn chủ yếu để vô hiệu hóa selection, và tất nhiên highlightingbị vô hiệu hóa với điều đó. Nhiều câu trả lời được 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. Để vô hiệu hóa chỉ làm nổi bật việc sử dụng cell.selectionStyle = .Nonehoặc đi đếnstoryboard / cell / Selection = None
Andrej

Vui lòng cập nhật tiêu đề hoặc bài viết. 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 cung cấp là gì.
Daniel Springer

Câu trả lời:


604

Đối với tôi, sau đây làm việc tốt:

tableView.allowsSelection = false

Điều này có nghĩa didSelectRowAt#đơ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ẽ hoàn toàn không làm gì. (Và do đó, rõ ràng, sẽ không bao giờ có hoạt hình được chọn.)

(Lưu ý rằng, trên các ô, bạn có UIButtonhoặc bất kỳ điều khiển nào khác, tất nhiên các điều khiển đó vẫn hoạt động. Mọi điều khiển bạn có 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" sử dụng didSelectRowAt#.)

Một điểm khác cần lưu ý là: Điều này không hoạt động khi UITableViewở chế độ chỉnh sửa. Để hạn chế lựa chọn ô trong chế độ chỉnh sửa, hãy sử dụng mã như dưới đây:

tableView.allowsSelectionDuringEditing = false 

6
Điều này cuối cùng đã làm việc cho tôi, tôi đã thử 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

6
Tôi nghĩ rằng, đây là lựa chọn tốt nhất. Các nút trên các ô được kích hoạt với điều này, nhưng văn bản không hoạt động.
Fahim Parkar

513
Làm thế nào đây là câu trả lời được chấp nhận và có nhiều phiếu bầu lên? Nó không trả lời câu hỏi nào cả! Bạn cần đặt thuộc selectionStyletính trên ô: cell.selectionStyle = UITableViewCellSelectionStyle.Nonetrong Swift hoặc cell.selectionStyle = UITableViewCellSelectionStyleNonetrong Objective-C.
gật đầu

5
Này làm việc cho tôi trong nhanh chóng 2.tableView.allowSelection = false
Khanad

15
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 và không có lựa chọn nào có thể làm việc cả, hoặc cả hai đều có thể thất bại. Đây là một ví dụ. Nếu bạn muốn chọn ô và có tên tableViewDidSelectRowAtIndexPathđược gọi, cell.selectionStyle = .Nonemong muốn. Nếu bạn không muốn hoặc không quan tâm đến chức năng ủy nhiệm đó được gọi (nghĩa là có một trường văn bản trong cài đặt tableViewCell) tableView.allowsSelection = falsethì tốt.
Made2k

1964

Tất cả những gì bạn phải làm là thiết lập kiểu chọn trên UITableViewCellthể hiện 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, đảm bảo rằng bạn không thực hiện -tableView:didSelectRowAtIndexPath:trong ủy nhiệm xem bảng của mình 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êm thông tin ở đâyở đây


122
@Tony Ý tưởng tồi nếu bạn có UITextField bên trong ô.
Aniruddh Joshi

73
@TonyMillion 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 được xây dựng, chẳng hạn như vuốt để xóa. Nếu bạn đặt userInteractionEnables thành NO thì nút xóa sẽ không phản hồi với các sự kiện chạm của người dùng.
Carlos P

47
muộn với chủ đề này, nhưng thay vì userInteraction, hãy sử dụng cell.allowsSelection. Điều đó ngăn các phương thức tương tác của tế bào nhưng không chặn công cụ phản hồi UIView thông thường.
Chris C

4
Đặt cell.userInteractionEnable = Không sẽ không kích hoạt didSelectRowAtIndexPath.
dùng4951

25
Tôi sẽ bỏ phiếu trả lời, nhưng để rõ ràng, OP chỉ yêu cầu vô hiệu hóa "tô sáng", không để vô hiệu hóa toàn bộ tương tác của tế bào, vì vậy tất cả các nhận xét này đều không chính đáng.
Frederic Yesid Peña Sánchez

353

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, thực sự 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 tính năng tô sáng 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 - được lưu trữ trong 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 chính tế bào.

LƯU Ý : Như Tony Million đã lưu ý ở trên, điều này KHÔNG ngăn chặntableView:didSelectRowAtIndexPath:. Tôi giải quyết vấn đề này bằng các câu lệnh "nếu" đơn giản, thường xuyên nhất là kiểm tra phần này và tránh hành động cho một phần cụ thể.

Một cách khác tôi nghĩ để kiểm tra 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. Để làm điều này cho toàn bộ bảng, bạn có thể áp dụng giải pháp trên cho từng ô 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được 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. Để làm cho toàn bộ bảng "chỉ đọc"

[tableView setUserInteractionEnabled:NO];



5. Để xác định khi đang di chuyển có làm nổi bật một ô (mà theo câu trả lời này hoàn toàn bao gồm lựa chọn), bạn có thể thực hiện UITableViewDelegatephương thức giao thức sau :

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

3
Nếu bạn tải thiết kế ô từ ngòi, hộp kiểm (trong IB) sẽ hoạt động tốt cho số 3 (và trên các bảng cho số 4). Đối với # 4 so với # 2, sự khác biệt liệu các điều khiển bên trong ô có tương tác hay không?
lilbyrdie

4
Đú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ứ thứ gì ngoài UIView hoặc UILabels trong một tế bào không tương tác nằm 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 một cái gì đó khác đang xảy ra.
mbm29414

8
# 4 là một ý tưởng tồi tệ, thực hiện điều này cũng sẽ vô hiệu hóa cuộn trong chế độ xem bảng
simon

4
@simon Thật ra, đó không phải là một ý tưởng tồi; đó 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 thuộc vào 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ể tự thực hiện nếu cần. Tôi đồng ý # 4 không hữu ích RẤT NHIỀU, nhưng đó không phải là một ý tưởng tồi.
mbm29414

3
Để hoàn thiện, bạn có thể vui lòng thêm một tiếng hét cho tableView:shouldHighlightRowAtIndexPath:, nói chung (không phải luôn luôn) cách tiếp cận ưa thích của tôi.
Stewohn 21/07/2015

82

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 bản thân tôi khi 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;

Ngoài việc ngăn chặn lựa chọn, điều này cũng dừng bảngView: didSelectRowAtIndexPath: được gọi cho các ô đã đặt. (Tín dụng cho 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 bấm, thay vào đó, bạn cần phải thay thế:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

và bạn cũng cần bỏ qua mọi nhấp chuột vào ô - (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!)


Điều gì nếu chúng ta có một nút trong tế bào của chúng tôi?
Umair Afzal

56

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

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


2
Tình cờ gặp 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 hỏi này. Đây là cách chắc chắn.
beebcon

2
Đây thực sự là câu trả lời đúng 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

50

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

Thanh tra UITableView


2
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


36

Trong của bạn UITableViewCell's XIB trong Thuộc tính giá trị thanh tra bộ Selectionđến None.

nhập mô tả hình ảnh ở đây


Đây chính xác là những gì tôi cần. Tôi vẫn muốn thông báo didSelect ... nhưng không có dấu hiệu hiển thị của lựa chọn. Cảm ơn!
Timothy Tripp

Vui vì nó đã giúp! :)
Pathan

35

Nếu bạn muốn lựa chọn chỉ flash, không ở trạng thái đã chọn, bạn có thể gọi, trong

didSelectRowAtIndexPath

sau đây

[tableView deselectRowAtIndexPath:indexPath animated:YES];

do đó, nó sẽ flash trạng thái được chọn và hoàn nguyên.


3
Với cách tiếp cận này, hàng ngay lập tức nổi bật và sau đó mờ dần trong nửa giây. Đây là cách Apple định kiểu các menu Cài đặt của họ, vì vậy nó có vẻ tốt với tôi.
VinceFior

34

Trong trường hợp bất cứ ai cần câu trả lời cho Swift :

cell.selectionStyle = .None

1
chúng ta cũng có thể sử dụng ô này.selectionStyle = UITableViewCellSelectionStyle.None
bable

29

Đây là những gì tôi sử dụng, cellForRowAtIndexPathviết mã này.:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

28

Từ UITableViewDelegateGiao thức, bạn có thể sử dụng phương thức willSelectRowAtIndexPathreturn nilnếu bạn không muốn hàng được chọn.

Theo cách tương tự, bạn có thể sử dụng willDeselectRowAtIndexPathphương thức và return nilnếu bạn không muốn hàng bỏ chọn.


5
Tôi không thích phương pháp này vì nó vẫn hiển thị ô ở trạng thái được tô sáng cho đến khi chạm lên.
kbanman

2
đó chính xác là lý do tại sao tôi thích nó :-)
Joris Weimar

24

1- Tất cả những gì bạn phải làm là thiết lập kiểu chọn trênUITableViewCell thể hiện 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:

cell.selectionStyle = .none


2 - Không thực hiện - tableView:didSelectRowAtIndexPath:trong chế độ xem bảng của bạn delegatehoặ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ó.

3 - Hơn nữa, bạn cũng có thể làm điều đó từ bảng phân cảnh. Bấm vào ô xem bảng và trong trình kiểm tra thuộc tính trong Ô xem bảng, thay đổi thả xuống bên cạnh Lựa chọn thành Không có.


4 - Bạn có thể tắt tính năng tô sáng ô bảng bằng mã bên dưới trong (iOS) Xcode 9, Swift 4.0

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
        cell.selectionStyle = .none
        return cell


}

20

Mục tiêu-C:

  1. Bên dưới đoạn trích tắt đánh dấu nhưng nó cũng vô hiệu hóa cuộc gọi đến didSelectRowAtIndexPath. Vì vậy, nếu bạn không thực hiện didSelectRowAtIndexPaththì sử dụng phương pháp dưới đây. Điều này nên được thêm vào khi bạn đang tạo bảng. Điều này sẽ làm việc trên các nút và UITextFieldbên trong các tế bào mặc dù.

    self.tableView.allowsSelection = NO;
  2. Bên dưới đoạn trích tắt tính năng tô sáng và nó không tắt cuộc gọi đến didSelectRowAtIndexPath. Đặt kiểu chọn ô là Không có trongcellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
  3. Đoạn dưới đây vô hiệu hóa mọi thứ trên di động. Điều này sẽ vô hiệu hóa sự tương tác với buttons, textfields:

    self.tableView.userInteractionEnabled = false;

Nhanh:

Dưới đây là Swifttương đương với các Objective-Cgiải pháp trên :

  1. Thay thế giải pháp đầu tiên

    self.tableView.allowsSelection = false
  2. Thay thế giải pháp thứ hai

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
  3. Thay thế giải pháp thứ ba

    self.tableView.userInteractionEnabled = false

19

Cố gắng gõ:

cell.selected = NO;

Nó sẽ bỏ chọn hàng của bạn khi cần thiết.

Trong Swift3 ...

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let r = indexPath.row
    print("clicked .. \(r)")
    tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}

14

Tôi cũng đã chiến đấu với điều này khá nặng nề, có quyền kiểm soát trong UITableViewCellviệc cấm sử dụng userInteractionEnabledtài sản của tôi . Tôi có một bảng tĩnh 3 ô để cài đặt, 2 có ngày, 1 có công tắc bật / tắt. Sau khi chơi trong Storyboard / IB, tôi đã quản lý để làm cho cái dưới cùng không thể chọn, nhưng khi bạn nhấn vào nó, lựa chọn từ một trong những hàng trên cùng sẽ biến mất. Đây là hình ảnh WIP trong cài đặt của tôi UITableView:

Cài đặt UITableView

Nếu bạn nhấn vào hàng thứ 3, không có gì xảy ra, lựa chọn sẽ ở hàng thứ hai. Chức năng này thực tế là một bản sao của màn hình chọn thời gian thêm sự kiện của ứng dụng Lịch của Apple.

Mã này tương thích đáng ngạc nhiên, tất cả đều giảm xuống còn IOS2 = /:

- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 2) {
        return nil;
    }
    return indexPath;
}

Điều này hoạt động cùng với việc đặt kiểu chọn thành không, vì vậy ô không nhấp nháy khi chạm vào các sự kiện


11

Chúng ta có thể viết mã như

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

nhưng khi chúng ta có xib ô tùy chỉnh trên dòng đưa ra cảnh báo tại thời điểm đó cho

tùy chỉnh ô xib

chúng ta cần thiết lập kiểu chọn Không có từ trình tạo giao diện


11

Bạn chỉ cần đặt mã này vào cellForRowAtIndexPath

Để tắt thuộc tính lựa chọn của ô: (Trong khi nhấn vào ô).

cell.selectionStyle = UITableViewCellSelectionStyle.None

Cảm ơn bạn, tôi có một hình ảnh trong tế bào của tôi và một nhãn ở trên nó. Tôi đã đặt nền nhãn, nhưng mỗi lần tôi nhấp vào nền sẽ biến mất, điều này đã giải quyết nó.
Darko

10

thử cái này

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

và bạn cũng có thể thiết lập kiểu lựa chọn bằng cách sử dụng giao diện.


10

Tôi đang sử dụng này, mà làm việc cho tôi.

cell?.selectionStyle = UITableViewCellSelectionStyle.None

7

Mặc dù đây là giải pháp tốt nhất và dễ nhất để ngăn hàng hiển thị phần tô sáng trong khi chọn

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Tôi cũng muốn đề xuất rằng đôi khi nó hữu ích để hiển thị ngắn gọn rằng hàng đã được chọn và sau đó tắt nó. Điều này cảnh báo người dùng với xác nhận về những gì họ dự định chọn:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}

7

Vô hiệu hóa trực tiếp tính năng tô sáng của TableViewCell vào bảng phân cảnh

nhập mô tả hình ảnh ở đây


6

Để tắt tính năng tô sáng của UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Và không nên cho phép người dùng tương tác với tế bào.

cell.userInteractionEnabled = NO;

6

Bạn cũng có thể đặt màu nền thành Xóa để đạt được hiệu ứng tương tự như UITableViewCellSelectionStyleNonetrong trường hợp bạn không muốn / không thể sử dụngUITableViewCellSelectionStyleNone .

Bạn sẽ sử dụng mã như sau:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

Điều này có thể làm giảm hiệu suất của bạn khi bạn thêm chế độ xem được tô màu thêm vào mỗi ô.


6

Bạn có thể dùng :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

trong ô cho hàng tại phương thức đường dẫn chỉ mục của UITableView của bạn.

Ngoài ra, bạn có thể sử dụng:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

trong phương pháp xem bảng didselectrowatindExath.


Bây giờ là cell.selectionStyle = UITableViewCellSelectionStyle.nonetrong Swift 3.
Dan

5

Bạn có thể sử dụng cái này

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5

Bạn có thể dùng ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];


5
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Chúc mừng mã hóa !!!


5

Bạn cũng có thể làm điều đó từ bảng phân cảnh. Bấm vào ô xem bảng và trong trình kiểm tra thuộc tính trong Ô xem bảng, thay đổi thả xuống bên cạnh Lựa chọn thành Không có.

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.