Виберіть рядок перегляду таблиць програмно


135

Як я програматично вибираю UITableViewрядок, щоб

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

отримує страту? selectRowAtIndexPathвиділить лише рядок.


Я зіткнувся з тією ж проблемою, і я просто впорядкував посилання: stackoverflow.com/questions/5324501/… Я сподіваюся, що це стане для вас корисним.
Майкл

Відповіді:


109

З довідкової документації:

Виклик цього методу не призводить до того, що делегат отримує повідомлення tableView:willSelectRowAtIndexPath:або tableView:didSelectRowAtIndexPath:повідомлення, а також не надсилає UITableViewSelectionDidChangeNotificationспостереження спостереженням.

Що я б робив:

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

І тоді, звідки ви хотіли зателефонувати selectRowAtIndexPath, ви натомість викликаєте doSomethingWithRowAtIndexPath. Крім того, ви можете також зателефонувати на selectRowAtIndexPath, якщо ви хочете, щоб відбувся зворотний зв’язок із інтерфейсом користувача.


4
Або вибираючи рядок програмно, ви можете викликати tableView: didSelectRowAtIndexPath: самостійно (у класі, який ви провели як делегат).
Кендалл Гельмстетер Гелнер

3
Цей метод здається мені злому, він зробив роботу, але я думаю, що повинен бути кращий спосіб зробити це.
Tapan Thaker

1
Я насправді не думаю, що вам потрібно створити виклик "doSomethingWithRowAtIndexPath", чи не можете ви просто викликати метод делегування та передавати аргументи, необхідні для виконання логіки didSelect з того місця, де ви реалізували метод делегата?
ImpactZero

111

Як сказав Яанус:

Виклик цього (-selectRowAtIndexPath: анімований: scrollPosition :) метод не спричиняє делегата отримувати tableView: willSelectRowAtIndexPath: або tableView: didSelectRowAtIndexPath: повідомлення, а також не надсилатиме повідомлення UITableViewSelectionDidChangeNovers повідомлень.

Тому вам доведеться просто викликати delegateметод самостійно.

Наприклад:

Версія 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)

Версія ObjectiveC:

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

Версія 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: анімований: scrollPosition: повинен зробити свою справу.

Просто пройдіть UITableViewScrollPositionNoneдля scrollPosition, і користувач не побачить жодного руху.


Ви також повинні мати можливість вручну запустити дію:

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

після вас selectRowAtIndexPath:animated:scrollPosition:так виділяється, як і будь-яка пов'язана з цим логіка.


Вибачте, саме цим я користуюся. Я випадково поставив scrollToRowAtIndexPath. Я оновив питання. scrollToRowAtIndexPath лише виділяє клітинку.
4thSpace

2
Так, мені шкода. Він говорить, що не запустить didSelectRowAtIndexPath прямо там у посиланні на документи, яке я розмістив. Мені потрібно навчитися читати.
anq

@anq: Дуже дякую! Це допомагає мені, коли я викликаю didSelectRowAtIndexPath: indexPath у користувацькій комірці.
Бентлі

21

якщо ви хочете вибрати якийсь рядок, це допоможе вам

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

Це також виділить рядок. Потім делегат

 [someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];

18

Швидкий 3/4/5 Рішення

Виберіть рядок

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

Виберіть рядок

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

Для мене додавання ".delegate?" було ключовим. (Swift 4.5)
KoreanXcodeWorker

4

Існує два різних способи для платформ iPad та iPhone, тому вам потрібно реалізувати обидва:

  • вибір обробника та
  • 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];

3

Використовуйте цю категорію, щоб вибрати рядок таблиці та виконати заданий вираз після затримки.
Зателефонуйте цьому у межах свого viewDidAppearметоду:

[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
Питання не мало нічого спільного з сегами.
видалено_користувач

Так, ні про що у вашій відповіді не пов’язано питання
dulgan

2
Оцініть цю відповідь. Це прекрасно спрацьовує, якщо користувач хоче досягти такої ж поведінки, але використовує розкадровки.
Bijoy Thangaraj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.