Câu trả lời:
Đặt thuộc selectionStyle
tính của ô trong bảng thành UITableViewCellSelectionStyleNone
. Điều đó sẽ ngăn nó làm nổi bật và bạn cũng có thể kiểm tra thuộc tính đó trong của mình tableView:didSelectRowAtIndexPath:
.
Để ngăn chặn hoàn toàn sự lựa chọn của UITableViewCell
, có của bạn UITableViewDelegate
thực hiện tableView:willSelectRowAtIndexPath:
. Từ phương thức đó, bạn có thể quay trở lại nil
nếu bạn không muốn hàng được chọn.
- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
// Determine if row is selectable based on the NSIndexPath.
if (rowIsSelectable) {
return path;
}
return nil;
}
Điều này ngăn không cho hàng được chọn và tableView:didSelectRowAtIndexPath:
không được gọi. Tuy nhiên, lưu ý rằng điều này không ngăn hàng được đánh dấu.
Nếu bạn muốn ngăn chặn hàng khỏi bị làm nổi bật được trên cảm ứng, bạn có thể đảm bảo rằng các tế bào của selectionStyle
được thiết lập để UITableViewCellSelectionStyleNone
, hoặc tốt hơn là bạn có thể có của bạn UITableViewDelegate
thực hiện tableView:shouldHighlightRowAtIndexPath:
như sau:
- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
// Determine if row is selectable based on the NSIndexPath.
return rowIsSelectable;
}
didSelectRowAtIndexPath
vì willSelectRowAtIndexPath
dù thế nào đi nữa sẽ luôn được gọi.
dùng cái này:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
didSelectRowAtIndexPath
vẫn được gọi.
Chỉ dành cho iOS 6+.
Bạn có thể triển khai phương thức
tableView:shouldHighlightRowAtIndexPath:
trong ủy nhiệm của mình. Đọc thêm tại đây: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html
Cũng gặp vấn đề này, hãy thử mọi thứ đã được đề cập. Mẹo cuối cùng, loại bỏ "đèn flash xanh" khi chọn một ô trong bảng là thêm dòng này:
self.myTableView.allowsSelection = NO;
Không chắc liệu đó là một dòng này hay tất cả mọi thứ kết hợp, nhưng kết quả tổng thể là tôi không nhận được thêm lựa chọn màu xanh lam hay thậm chí là đèn flash màu xanh lam. Vui mừng!
Bộ cell.userInteractionEnabled = NO;
Apple nói rằng điều đầu tiên bạn nên làm trong didSelectRowAtIndexPath là bỏ chọn hàng
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
Sau đó, bạn có thể thay đổi AccessoryType thành một dấu kiểm hoặc không có, v.v. Vì vậy, khi bạn nhập didSelectRowAtIndexPath, bạn có thể bỏ chọn hàng và nếu nó không có nghĩa là được chọn, chỉ cần không chọn hàng đó.
Một cách khác là thêm một vài phương thức danh mục vào UITableViewCell
. Tôi thích câu này hơn câu trả lời của Sebastians (cũng hay) vì cách tôi xây dựng bàn ăn của mình. Tôi nghĩ nó có thể hữu ích cho người khác.
- (void)setSelectable:(BOOL)enabled {
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
[self setUserInteractionEnabled:enabled];
}
- (BOOL)isSelectable {
BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
[self isUserInteractionEnabled];
return ! disabled;
}
Swift 4:
Bạn có thể ngăn lựa chọn và đánh dấu bằng cách sử dụng UITableViewDelegate: shouldHighlightRowAt
Câu trả lời này giả định rằng bạn đã tạo một ô tùy chỉnh có tên: CustomTableViewCell
Và bạn đã tạo một boolean bên trong ô tùy chỉnh đó có tên: isSelectable
func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
if cell.isSelectable == false {
return false
} else {
return true
}
}
Đây là phiên bản Swift của câu trả lời phản đối của Sebastian Celis.
Có một cách đơn giản khác để tránh vùng chọn xuất hiện dưới dạng màu xanh lam.
Chọn một ô bạn không muốn xuất hiện dưới dạng màu xanh lam.
Sau đó chọn người kiểm tra thuộc tính (biểu tượng chiếc khiên bên cạnh biểu tượng thước kẻ trên chế độ xem thuộc tính ở bên cạnh).
Sau đó, thay đổi trường 'Lựa chọn' từ 'Xanh lam' thành 'Không có'.
Lưu ý, có lẽ điều này vẫn đang được chọn, nó sẽ không xuất hiện như được chọn nếu tất cả những gì bạn muốn là tránh hiệu ứng giao diện người dùng.
Sử dụng tableView: willDisplayCell: forRowAtIndexPath: thay vì tableView: didSelectRowAtIndexPath: để loại bỏ flash xuất hiện lần đầu tiên bạn chạm vào ô.
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
Để bỏ chọn một số hàng nhất định, bạn phải thực hiện một số thay đổi trong hai phương thức của ủy nhiệm UITableView.
Trong phương pháp dưới đây
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
sau khi phân bổ ô, hãy viết mã bên dưới
if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;
Đoạn mã trên sẽ ngăn chặn việc tô sáng ô, nếu bằng cách nào đó người dùng cố gắng chọn.
trong phương pháp ủy quyền này bên dưới
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if(indexPath.row == someCellNumber) return;
//for other cells write the code below...
}
nếu bạn không viết if(indexPath.row == someCellNumber) return;
hàng sẽ vẫn được chọn và có khả năng xảy ra sự cố ứng dụng
Swift 4:
Trong lớp ô:
selectionStyle = .none
tableView:shouldHighlightRowAtIndexPath:
như ghi nhận của Ayush dưới đây