Làm thế nào để tôi lập trình chọn một UITableView
hàng sao cho
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
bị xử tử? selectRowAtIndexPath
sẽ chỉ làm nổi bật hàng.
Làm thế nào để tôi lập trình chọn một UITableView
hàng sao cho
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
bị xử tử? selectRowAtIndexPath
sẽ chỉ làm nổi bật hàng.
Câu trả lời:
Gọi phương thức này không khiến đại biểu nhận được tin nhắn
tableView:willSelectRowAtIndexPath:
hoặctableView:didSelectRowAtIndexPath:
tin nhắn, cũng không gửiUITableViewSelectionDidChangeNotification
thô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.
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 delegate
phươ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)
UITableView's selectRowAtIndexPath: hoạt hình: scrollPocation: nên thực hiện thủ thuật.
Chỉ cần vượt qua UITableViewScrollPositionNone
cho 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.
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];
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)
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:
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];
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 viewDidAppear
phươ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