2010-01-09 4 views
116

Как программно выбрать UITableView строку, так чтоВыберите TableView ряд программно

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

запускается на выполнение? selectRowAtIndexPath будет выделять только строку.

+0

Я столкнулся с одной и той же проблемой и просто воспользовался ссылкой: http://stackoverflow.com/questions/5324501/select-tableviews-row-from-an-another-view Я надеюсь, что это будет полезно для вас. – michael

ответ

103

От reference documentation:

Вызов этого метода не вызывает делегат получить сообщение tableView:willSelectRowAtIndexPath: или tableView:didSelectRowAtIndexPath:, а также не посылать UITableViewSelectionDidChangeNotification уведомления наблюдателей.

Что бы я сделал это:

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

А потом, откуда вы хотите позвонить selectRowAtIndexPath, вы вместо того, чтобы позвонить doSomethingWithRowAtIndexPath. Кроме того, вы также можете вызвать selectRowAtIndexPath, если хотите, чтобы пользовательский интерфейс был выполнен.

+3

Или когда вы выбираете строку программно, вы можете вызвать tableView: didSelectRowAtIndexPath: самостоятельно (в классе, который вы подключили в качестве делегата). –

+2

Этот метод кажется мне взломанным, он действительно выполнил эту работу, но я думаю, что должен быть лучший способ сделать это. –

+1

Я действительно не думаю, что вам нужно создать вызов «doSomethingWithRowAtIndexPath», не можете ли вы просто вызвать метод делегата и передать аргументы, необходимые для выполнения логики didSelect, из того места, где вы реализовали метод делегата? – ImpactZero

63

UITableView's selectRowAtIndexPath:animated:scrollPosition: должен сделать трюк.

Просто пройдите UITableViewScrollPositionNone для scrollPosition и пользователь не увидит никакого движения.


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

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

после того, как вы selectRowAtIndexPath:animated:scrollPosition: так гвоздем происходит, а также любые связанные с логикой.

+0

Извините, это то, что я использую. Я случайно положил scrollToRowAtIndexPath. Я обновил вопрос. scrollToRowAtIndexPath выделяет только ячейку. – 4thSpace

+2

Да, извините. Он говорит, что он не будет запускать didSelectRowAtIndexPath прямо там, в ссылке docs, которую я опубликовал. Мне нужно научиться читать. – anq

+0

@anq: Спасибо вам большое! Это помогает мне, когда я вызываю didSelectRowAtIndexPath: indexPath в пользовательской ячейке. – Bentley

2

Используйте эту категорию, чтобы выбрать строку таблицы и выполнить заданный сеанс после задержки.
Вызов этого метода в вашем 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

Вопрос не имеет ничего общего с segues. –

+0

Да, ни о чем в вашем ответе не связано с вопросом – dulgan

+2

Оцените этот ответ. Это отлично работает, если пользователь хочет достичь такого же поведения, но использует раскадровки. –

88

Как Jaanus сказал:

Вызов этого (-selectRowAtIndexPath: анимированные: метод scrollPosition :) не вызывает делегат получать Tableview: willSelectRowAtIndexPath: или tableView: didSelectRowAtIndexPath: сообщение и не отправит UITableViewSelectionDidChangeNotification уведомления наблюдателям.

Для этого вам нужно просто позвонить по методу 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:1 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) 
+3

Отлично, спасибо! +1 – edzio27

+1

Спасибо, приятель! Неплохо. – Felipe

2

Есть два различных метода для 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]; 
    
19

если вы хотите выбрать несколько строк, это поможет вам

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

Это также обратил внимание на строку. Затем делегат

[someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath]; 
6

Swift 3,0 Решение

Select Row

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

Deselect Row

let deselectIndexPath = IndexPath(row: 7, section: 0) 
tblView.deselectRow(at: deselectIndexPath, animated: true) 
tblView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath) 
Смежные вопросы