2010-08-30 33 views
35

Làm thế nào để bạn vô hiệu hóa chỉ chọn một ô trong UITableView? Tôi có một số, và tôi chỉ muốn người cuối cùng bị vô hiệu hóa.Vô hiệu hóa lựa chọn một UITableViewCell duy nhất

+0

bản sao có thể có của [UITableview: Cách tắt lựa chọn cho một số hàng nhưng không phải người khác] (http://stackoverflow.com/questions/2267993/uitableview-how-to-disable-selection-for-some-rows-but -not-others) – JosephH

Trả lời

51
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = ... 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

} 
+32

Điều này sẽ ngăn không cho ô xuất hiện được chọn, nhưng 'tableView: didSelectRowAtIndexPath:' vẫn sẽ được gọi. – Brian

+2

Xem câu trả lời của tôi cho một giải pháp sạch thực sự hoạt động. – Barry

+0

Sử dụng cả hai 'cell.selectionStyle = .None' và' cell.userInteractionEnabled = false' kết hợp sẽ bao gồm hầu hết các kịch bản. – SwiftArchitect

10
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([self numberOfRowsInSection] == [indexPath row]) { 
     return nil; 
    } else { 
     return indexPath; 
    } 
} 

hàng cuối cùng của bảng sẽ không được chọn

+1

Điều này sẽ ngăn chặn các tế bào từ thực sự được lựa chọn, nhưng nó vẫn sẽ được đánh dấu khi người dùng chạm vào nó – Brian

+2

Xin lỗi, cần phải thêm kiểu UITableViewCellSelectionStyleNone vào ô –

+1

Tôi có thể thêm rằng thiết lập phong cách lựa chọn tableview nên được thực hiện trong cellForRowAtIndexPath: tránh lag khi tải TableView (xem bảng mất 1-2 tốt để vô hiệu hóa lựa chọn cho ô). –

50

Để ngừng sử dụng chỉ là một số tế bào được chọn:

cell.userInteractionEnabled = NO; 

Cũng như ngăn ngừa sự lựa chọn, điều này cũng dừng tableView : didSelectRowAtIndexPath: đang được gọi cho các ô đã được thiết lập. Nó cũng sẽ làm cho lồng tiếng xử lý nó giống như một nút mờ (có thể hoặc có thể không được những gì bạn muốn). Lưu ý rằng nếu bạn có các yếu tố tương tác trong ô (ví dụ: nút chuyển/nút), bạn sẽ cần phải sử dụng cell.selectionStyle = UITableViewCellSelectionStyleNone; thay thế và sau đó đảm bảo bỏ qua các lần nhấn trên ô trong tableView:didSelectRowAtIndexPath:.

+0

Hãy thử thực hiện việc này trên chế độ xem nhận điểm đánh dấu. Nếu không, nó cũng giống như vô hiệu hóa ô. –

+4

Tôi không thể sử dụng điều này vì nó cũng vô hiệu hóa 'cell.accessoryView', mà tôi đã đặt thành' UIButton' mà tôi muốn có thể gõ. – ma11hew28

+0

Ngoài ra, điều này sẽ khiến Voice Over xử lý không chính xác ô dưới dạng nút mờ thay vì văn bản tĩnh (có phụ kiện tùy chọn). – Endersstocker

2

Như tôi đã đề cập in another thread tất cả các phương pháp trên không giải quyết được vấn đề một cách chính xác. Cách đúng đắn về việc vô hiệu hóa một tế bào là thông qua phương pháp

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

và phương pháp mà người ta phải sử dụng

[cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

mà vô hiệu hóa lựa chọn tế bào nhưng vẫn cho phép người dùng tương tác với subviews của ô như là UISwitch.

18

Ném này trong tùy chỉnh của bạn Bảng VC:

// cells lacking UITableViewCellAccessoryDisclosureIndicator will not be selectable 
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 
    if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) { 
     return nil; 
    } 
    return indexPath; 
} 

// disabled cells will still have userinteraction enabled for their subviews 
- (void)setEnabled:(BOOL)enabled forTableViewCell:(UITableViewCell *)tableViewCell 
{ 
    tableViewCell.accessoryType = (enabled) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; 
    // if you dont want the blue selection on tap, comment out the following line 
    tableViewCell.selectionStyle = (enabled) ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone; 
} 

Sau đó, để bật/tắt lựa chọn cho someTableViewCell, làm điều này:

[self setEnabled:state forTableViewCell:someTableViewCell]; 

Bạn đã làm xong và có thể xuất xưởng.

+0

Cảm ơn, điều này hoạt động như một say mê! – Harry

1

Giải pháp sạch nhất mà tôi đã tìm thấy cho điều này chỉ sử dụng phương thức ủy nhiệm willDisplayCell.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if([indexPath row] == 0) //<-----ignores touches on first cell in the UITableView 
    {      //simply change this around to suit your needs 
     cell.userInteractionEnabled = NO; 
     cell.textLabel.enabled = NO; 
     cell.detailTextLabel.enabled = NO; 
    } 
} 

Bạn không phải thực hiện thêm bất kỳ hành động nào trong phương thức ủy quyền didSelectRowAtIndexPath để đảm bảo chọn ô này bị bỏ qua. Tất cả các lần chạm trên ô này sẽ bị bỏ qua và văn bản trong ô cũng sẽ chuyển sang màu xám.

0

với iOS 6.

Bạn có thể sử dụng phương pháp đại biểu sau đây và gửi lại NO trong trường hợp bạn không nó để được lựa chọn và YES trong trường hợp bạn muốn nó được chọn.

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return indexPath.section == 0; 
} 
0

Hãy thử điều này trong nhanh chóng:

self.tableView.deselectRowAtIndexPath(indexPath, animated: true) 
0

Nếu có ai tự hỏi làm thế nào để đạt được điều này trong nhanh chóng thì đây là mã của tôi. Tôi đang sử dụng Xcode 7 và được thử nghiệm bằng iPad Retina (iOS 9).

cell.selectionStyle = UITableViewCellSelectionStyle .None 
cell.userInteractionEnabled = false 

Cố gắng đặt hai dòng mã này cho dù bạn muốn. Trong trường hợp của tôi, tôi đã sử dụng điều này trong phương pháp này để hiển thị các ô.

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 

Hãy nhớ hai dòng mã này sẽ chặn bất kỳ loại lựa chọn hoặc tương tác nào với các ô của bạn nhưng bạn chỉ có thể sử dụng dòng đầu tiên riêng lẻ nếu muốn. Đó là ...

cell.selectionStyle = UITableViewCellSelectionStyle .None 

Chỉ dòng này sẽ chặn lựa chọn vào ô của bạn.

Tuy nhiên, dòng thứ hai sẽ làm cho ô "Chỉ đọc". Đó là ..

cell.userInteractionEnabled = false 

Cảm ơn

Hy vọng điều này giúp đỡ.

Các vấn đề liên quan