UITableView Đặt một số ô là “không thể chọn”


109

Làm cách nào để đặt thuộc tính ô của UITableView thành không chọn được? Tôi không muốn nhìn thấy hộp lựa chọn màu xanh lam đó khi người dùng chạm vào ô.


4
Lưu ý nhân viên của Google gần đây: Cách để làm điều này như iOS 6 và lớn được tableView:shouldHighlightRowAtIndexPath:như ghi nhận của Ayush dưới đây
jemmons

Câu trả lời:


151

Đặt thuộc selectionStyletí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:.


3
Kendall nói đúng. Làm theo câu trả lời của Sebastian Celis để ngăn didSelectRowAtIndexPath được gọi ngay từ đầu. Tuy nhiên, bạn cũng nên thiết lập SelectionStyle để ngăn chặn sự nổi bật.
Daniel Dickison

yeah tôi giả sử Sebastian Celis' câu trả lời cho được câu trả lời đúng, nhờ Daniel
LolaRun

1
Fan Storyboard sử dụng TableViews tĩnh có thể chọn một UITableViewCell và dưới Attributes Inspector có thể tìm thấy những lựa chọn Field và đặt nó là None
Manuel BM

197

Để ngăn chọn hàng

Để ngăn chặn hoàn toàn sự lựa chọn của UITableViewCell, có của bạn UITableViewDelegatethực hiện tableView:willSelectRowAtIndexPath:. Từ phương thức đó, bạn có thể quay trở lại nilnế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.

Để ngăn chặn đánh dấu hàng

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 UITableViewDelegatethự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;
}

1
Cảm ơn! Chính xác những gì tôi cần.
Buchannon

10
Đây nên là câu trả lời được chấp nhận theo ý kiến ​​của tôi. Nó thực sự khắc phục sự cố thay vì che nó đi.
Tovi7 8/10/12

4
Lưu ý rằng tableView: willSelectRowAtIndexPath: được gọi sau khi tô sáng ô, điều này sẽ tạo ra nhấp nháy. Theo mô tả của Apple: Phương thức này không được gọi cho đến khi người dùng chạm vào một hàng và sau đó nhấc ngón tay lên; hàng không được chọn cho đến lúc đó, mặc dù nó được đánh dấu khi chạm xuống.
Daniel

5
Tôi đồng ý với @simpleBob. Để sử dụng giải pháp này, bạn cũng cần đặt cell.selectionStyle thành UITableViewCellSelectionStyleNone trên các hàng không được chọn. Nếu không, nó trông có vẻ khó khăn.
Kyle Clegg

Khi đó câu trả lời tốt nhất vẫn là câu trả lời được chấp nhận. Bạn chỉ có thể chọn không làm gì cả didSelectRowAtIndexPathwillSelectRowAtIndexPathdù thế nào đi nữa sẽ luôn được gọi.
Matthew Quiros

16

dùng cái này:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5
Điều đó chỉ ngăn màu lựa chọn hiển thị, didSelectRowAtIndexPathvẫn được gọi.
zekel

Đây cũng chính là câu trả lời giống như câu trả lời của Daniel Dickison cho câu hỏi này.

Swift 2.2 CẬP NHẬT - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com

11

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


3
Nên có nhiều phiếu bầu hơn. Đây là câu trả lời chính xác, việc thay đổi kiểu lựa chọn để bạn không thể thấy một ô được chọn, việc vô hiệu hóa tính năng sử dụng để bạn không thể nhấn vào một ô hoặc bỏ chọn các ô trên vùng lựa chọn là hành vi tấn công.
Stuart Campbell

9

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!


1
Vấn đề với điều này là nó làm cho tất cả các ô trong chế độ xem bảng không thể chọn được. Nếu bạn muốn một số ô có thể chọn được và những ô khác không thể chọn được, điều này sẽ không thực hiện được. Cách tiếp cận của Sebastian đã hiệu quả với tôi.
Terry

True, allowSelection = NO sẽ vô hiệu hóa lựa chọn cho tất cả các ô.
JOM

1
Có thuộc tính tương đương trong Trình tạo giao diện cho thuộc tính này không?
chrish 10/09/10

8

Bộ cell.userInteractionEnabled = NO;


Chờ đã, cứ làm như vậy. Sắp xếp. tạo chữ thường 'FALSE' và làm mất dấu chấm phẩy điên rồ đó. Điều đó sẽ nhanh chóng cho bạn. 'FALSE' là xấu và sai, bây giờ 'KHÔNG' là xấu và sai. Cho đến tuần sau khi 'sai' là xấu và sai, hãy làm theo cách đó.
HalR

5

sử dụng IB cũng là một cách thanh lịch:

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


3

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 đó.

Hướng dẫn lập trình Table View


1
Trong trường hợp đó, khi người dùng chạm vào ô, nó sẽ được đánh dấu trong một thời gian ngắn và sau đó không được đánh dấu - nhưng theo tôi hiểu, điểm mấu chốt là ngăn hoàn toàn nó làm nổi bật.
Kuba Suder

3

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

3

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.


1

Nếu bạn đã thiết kế ô của mình trong Trình tạo giao diện, bạn có thể thực hiện việc này bằng cách xóa hộp kiểm khỏi ' Đã bật tương tác với người dùng ' cho tableViewCell.


0

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.


0

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

0

Để 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



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.