Chọn hàng xem bàn theo chương trình


135

Làm thế nào để tôi lập trình chọn một UITableViewhàng sao cho

- (void)tableView:(UITableView *)tableView 
        didSelectRowAtIndexPath:(NSIndexPath *)indexPath

bị xử tử? selectRowAtIndexPathsẽ chỉ làm nổi bật hàng.


Tôi gặp phải vấn đề tương tự và chỉ cần liên kết tốt: stackoverflow.com/questions/5324501/ nam Tôi hy vọng nó sẽ hữu ích cho bạn.
michael

Câu trả lời:


109

Từ tài liệu tham khảo:

Gọi phương thức này không khiến đại biểu nhận được tin nhắn tableView:willSelectRowAtIndexPath:hoặc tableView:didSelectRowAtIndexPath:tin nhắn, cũng không gửi UITableViewSelectionDidChangeNotificationthông báo cho người quan sát.

Những gì tôi sẽ làm là:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self doSomethingWithRowAtIndexPath:indexPath];
}

Và sau đó, từ nơi bạn muốn gọi selectRowAtIndexPath, thay vào đó bạn gọi doS SomethingWithRowAtIndexPath. Trên hết, bạn cũng có thể gọi selectRowAtIndexPath nếu bạn muốn phản hồi UI xảy ra.


4
Hoặc khi bạn chọn hàng theo chương trình, bạn có thể gọi bảngView: didSelectRowAtIndexPath: mình (trong lớp bạn có dây với tư cách là đại biểu).
Kendall Helmstetter Gelner

3
Phương pháp này có vẻ như là một hack đối với tôi, nó đã hoàn thành công việc nhưng tôi nghĩ nên có một cách tốt hơn để làm điều đó.
Tapan Thaker

1
Tôi thực sự không nghĩ rằng bạn cần phải tạo một cuộc gọi "doS SomethingWithRowAtIndexPath" bạn không thể gọi phương thức ủy nhiệm và truyền các đối số bạn cần để thực hiện logic didSelect từ nơi bạn triển khai phương thức ủy nhiệm?
ImpactZero

111

Giống như Jaanus đã nói:

Gọi phương thức này (-selectRowAtIndexPath: anim: scrollPocation :) không khiến cho đại biểu nhận được một bảngView: willSelectRowAtIndexPath: hoặc tableView: didSelectRowAtIndexPath: thông báo, cũng sẽ không gửi thông báo UITableViewSelection

Vì vậy, bạn chỉ cần gọi delegatephương thức cho mình.

Ví dụ:

Phiên bản Swift 3:

let indexPath = IndexPath(row: 0, section: 0);
self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
self.tableView(self.tableView, didSelectRowAt: indexPath)

Phiên bản ObjectiveC:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView selectRowAtIndexPath:indexPath 
                            animated:YES 
                      scrollPosition:UITableViewScrollPositionNone];
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];

Phiên bản Swift 2.3:

 let indexPath = NSIndexPath(forRow: 0, inSection: 0);
 self.tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
 self.tableView(self.tableView, didSelectRowAtIndexPath: indexPath)

63

UITableView's selectRowAtIndexPath: hoạt hình: scrollPocation: nên thực hiện thủ thuật.

Chỉ cần vượt qua UITableViewScrollPositionNonecho scrollPocation và người dùng sẽ không thấy bất kỳ chuyển động nào.


Bạn cũng có thể tự chạy hành động:

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

sau khi bạn selectRowAtIndexPath:animated:scrollPosition:làm nổi bật cũng như bất kỳ logic liên quan.


Xin lỗi, đó là những gì tôi đang sử dụng. Tôi vô tình đặt scrollToRowAtIndexPath. Tôi đã cập nhật câu hỏi. scrollToRowAtIndexPath chỉ làm nổi bật ô.
Không gian thứ 4

2
Vâng, tôi xin lỗi. Nó nói rằng nó sẽ không bắn didSelectRowAtIndexPath ngay trong liên kết tài liệu tôi đã đăng. Tôi cần học đọc.
anq

@anq: Cảm ơn bạn rất nhiều! Nó giúp tôi khi tôi gọi didSelectRowAtIndexPath: indexPath trong ô tùy chỉnh.
Bentley

21

Nếu bạn muốn chọn một số hàng, điều này sẽ giúp bạn

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[someTableView selectRowAtIndexPath:indexPath 
                           animated:NO 
                     scrollPosition:UITableViewScrollPositionNone];

Điều này cũng sẽ làm nổi bật hàng. Sau đó đại biểu

 [someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];

18

Giải pháp Swift 3/4/5

Chọn hàng

let indexPath = IndexPath(row: 0, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)

Bỏ chọn hàng

let deselectIndexPath = IndexPath(row: 7, section: 0)
tblView.deselectRow(at: deselectIndexPath, animated: true)
tblView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath)

Đối với tôi, thêm '.delegate?' là chìa khóa (Swift 4.5)
KoreanXcodeWorker

4

Có hai phương pháp khác nhau cho nền tảng iPad và iPhone, vì vậy bạn cần thực hiện cả hai:

  • xử lý lựa chọn và
  • biệt.

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    
    // Selection handler (for horizontal iPad)
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
    
    // Segue (for iPhone and vertical iPad)
    [self performSegueWithIdentifier:"showDetail" sender:self];

3

Sử dụng danh mục này để chọn một hàng của bảng và thực hiện một segue nhất định sau khi trì hoãn.
Gọi đây trong viewDidAppearphương thức của bạn :

[tableViewController delayedSelection:withSegueIdentifier:]


@implementation UITableViewController (TLUtils)

-(void)delayedSelection:(NSIndexPath *)idxPath withSegueIdentifier:(NSString *)segueID {
    if (!idxPath) idxPath = [NSIndexPath indexPathForRow:0 inSection:0];                                                                                                                                                                 
    [self performSelector:@selector(selectIndexPath:) withObject:@{@"NSIndexPath": idxPath, @"UIStoryboardSegue": segueID } afterDelay:0];                                                                                               
}

-(void)selectIndexPath:(NSDictionary *)args {
    NSIndexPath *idxPath = args[@"NSIndexPath"];                                                                                                                                                                                         
    [self.tableView selectRowAtIndexPath:idxPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];                                                                                                                            

    if ([self.tableView.delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)])
        [self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:idxPath];                                                                                                                                              

    [self performSegueWithIdentifier:args[@"UIStoryboardSegue"] sender:self];                                                                                                                                                            
}

@end

2
Câu hỏi không có gì để làm với segues.
xóa_user

Có, về không có gì trong câu trả lời của bạn có liên quan đến câu hỏi
dulgan

2
Đánh giá cao câu trả lời này. Điều này hoạt động hoàn hảo nếu người dùng muốn đạt được hành vi tương tự nhưng đang sử dụng bảng phân cảnh.
Bijoy Thangaraj
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.