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ì?
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ì?
Câu trả lời:
Đố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ó UIButton
hoặ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
selectionStyle
tính trên ô: cell.selectionStyle = UITableViewCellSelectionStyle.None
trong Swift hoặc cell.selectionStyle = UITableViewCellSelectionStyleNone
trong Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
được gọi, cell.selectionStyle = .None
mong 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 = false
thì tốt.
Tất cả những gì bạn phải làm là thiết lập kiểu chọn trên UITableViewCell
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 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ó.
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 UITableViewDelegate
phương thức giao thức sau :
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
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.
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!)
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 = NO
hoặc bất kỳ kỹ thuật nào khác được ghi lại ở đây.
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 NoSelection
từ selection
tùy chọn (thuộc tính UITableView) trong ngăn thanh tra như trong hình bên dưới
GIẢI PHÁP CỐ ĐỊNH CHO SWift 3
cell.selectionStyle = .none
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.
Đây là những gì tôi sử dụng, cellForRowAtIndexPath
viết mã này.:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Từ UITableViewDelegate
Giao thức, bạn có thể sử dụng phương thức willSelectRowAtIndexPath
và return nil
nế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 willDeselectRowAtIndexPath
phương thức và return nil
nếu bạn không muốn hàng bỏ chọn.
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 delegate
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ó.
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
}
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 didSelectRowAtIndexPath
thì 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à UITextField
bên trong các tế bào mặc dù.
self.tableView.allowsSelection = NO;
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;
Đ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;
Dưới đây là Swift
tương đương với các Objective-C
giải pháp trên :
Thay thế giải pháp đầu tiên
self.tableView.allowsSelection = false
Thay thế giải pháp thứ hai
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Thay thế giải pháp thứ ba
self.tableView.userInteractionEnabled = false
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)
}
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 UITableViewCell
việc cấm sử dụng userInteractionEnabled
tà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:
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
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
Tôi đang sử dụng này, mà làm việc cho tôi.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
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];
...
}
Bạn cũng có thể đặt màu nền thành Xóa để đạt được hiệu ứng tương tự như UITableViewCellSelectionStyleNone
trong 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 ô.
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.
cell.selectionStyle = UITableViewCellSelectionStyle.none
trong Swift 3.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Chúc mừng mã hóa !!!
selection
, và tất nhiênhighlighting
bị 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áchdisable selection
và không giải quyết việc vô hiệu hóahighlighting
. Để vô hiệu hóa chỉ làm nổi bật việc sử dụngcell.selectionStyle = .None
hoặc đi đếnstoryboard / cell / Selection = None