Jak programowo wybrać UITableView
wiersz, aby
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
zostanie stracony? selectRowAtIndexPath
podświetli tylko wiersz.
Jak programowo wybrać UITableView
wiersz, aby
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
zostanie stracony? selectRowAtIndexPath
podświetli tylko wiersz.
Odpowiedzi:
Wywołanie tej metody nie powoduje, że delegat otrzymuje wiadomość
tableView:willSelectRowAtIndexPath:
lubtableView:didSelectRowAtIndexPath:
wiadomość, ani nie wysyłaUITableViewSelectionDidChangeNotification
powiadomień do obserwatorów.
Co bym zrobił to:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self doSomethingWithRowAtIndexPath:indexPath];
}
Następnie, z miejsca, w którym chciałeś wywołać metodę selectRowAtIndexPath, zamiast tego wywołujesz metodę doSomethingWithRowAtIndexPath. Ponadto możesz również wywołać metodę selectRowAtIndexPath, jeśli chcesz, aby informacje zwrotne dotyczące interfejsu użytkownika były realizowane.
Jak powiedział Jaanus:
Wywołanie tej metody (-selectRowAtIndexPath: animated: scrollPosition :) nie powoduje, że delegat odbiera tableView: willSelectRowAtIndexPath: lub tableView: didSelectRowAtIndexPath: message, ani nie wysyła powiadomień UITableViewSelectionDidChangeNotification do obserwatorów.
Musisz więc delegate
samemu wywołać metodę.
Na przykład:
Wersja 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)
Wersja ObjectiveC:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView selectRowAtIndexPath:indexPath
animated:YES
scrollPosition:UITableViewScrollPositionNone];
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
Wersja 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 selectRowAtIndexPath: animated: scrollPosition: powinno załatwić sprawę .
Po prostu przejdź UITableViewScrollPositionNone
do scrollPosition, a użytkownik nie zobaczy żadnego ruchu.
Powinieneś także móc ręcznie uruchomić akcję:
[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]
po tobie, selectRowAtIndexPath:animated:scrollPosition:
więc dzieje się podświetlenie, a także związana z nim logika.
jeśli chcesz wybrać wiersz, to ci pomoże
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[someTableView selectRowAtIndexPath:indexPath
animated:NO
scrollPosition:UITableViewScrollPositionNone];
Spowoduje to również wyróżnienie wiersza. Następnie deleguj
[someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];
Szybkie rozwiązanie 3/4/5
Wybierz wiersz
let indexPath = IndexPath(row: 0, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)
Odznacz wiersz
let deselectIndexPath = IndexPath(row: 7, section: 0)
tblView.deselectRow(at: deselectIndexPath, animated: true)
tblView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath)
Istnieją dwie różne metody dla platform iPad i iPhone, więc musisz wdrożyć obie:
segue.
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];
Użyj tej kategorii, aby wybrać wiersz tabeli i wykonać określoną ścieżkę po opóźnieniu.
Wywołaj to w ramach swojej viewDidAppear
metody:
[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