UITableView для UICollectionView с prepareForSegue не вызывается

Я все еще новичок в этом; так что будь нежным. Я хочу загрузить сет-лист из flickr, затем выбрать следующий набор и просмотреть его изображения. До сих пор я заключил контракт на получение сет-листа. Теперь я хочу иметь возможность щелкнуть один из заданных списков и перейти к UICollectionsView и просматривать его изображения. Мне нужна помощь с возможностью выбрать строку в UITableView, Я думаю, что где-то пропускаю шаг, но не могу найти дыру, которую пропускаю.

В любом случае вот код

- (void)viewDidLoad
{
    [super viewDidLoad];

self.tableView.rowHeight = 44;
photoURLs = [[NSMutableArray alloc] init];
photoSetNames = [[NSMutableArray alloc] init];
photoids = [[NSMutableArray alloc] init];
[self loadFlickrPhotos];

}
- (void)loadFlickrPhotos
{
// 1. Build your Flickr API request w/Flickr API key in FlickrAPIKey.h
NSString *urlString = [NSString stringWithFormat:@"http://api.flickr.com/services/rest/?method=flickr.photosets.getList&api_key=%@&user_id=%@&per_page=10&format=json&nojsoncallback=1", FlickrAPIKey, @"62975213@N05"];
NSURL *url = [NSURL URLWithString:urlString];
// 2. Get URLResponse string & parse JSON to Foundation objects.
NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
//    NSDictionary *results = [jsonString JSONValue];
NSDictionary *results = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
// 3. Pick thru results and build our arrays
NSArray *photosets = [[results objectForKey:@"photosets"] objectForKey:@"photoset"];
for (NSDictionary *photoset in photosets) {
    // 3.a Get title for e/ photo
    NSString *title = [[photoset objectForKey:@"title"] objectForKey:@"_content"];
    [photoSetNames addObject:(title.length > 0 ? title : @"Untitled")];
    NSString *photoid = [photoset objectForKey:@"id"];
    [photoids addObject:photoid];

}
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"viewGallery"]){
    flickrGalleryViewController *controller = (flickrGalleryViewController *)segue.destinationViewController;
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    controller.photoids = [photoids objectAtIndex:indexPath.row];
    NSLog(@"photoid = %@", controller.photoids);
}
}

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
 return [photoSetNames count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell Identifier"];
cell.textLabel.text = [photoSetNames objectAtIndex:indexPath.row];
return cell;

}

1 ответ

Решение

Если вы хотите выдвинуть / представить новое представление после нажатия строки в табличном представлении, вам нужно реализовать tableView: didSelectRowAtIndexPath: method:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Present new view here
}

didSelectRowAtIndexPath: метод вызывается представлением таблицы каждый раз, когда вы нажимаете строку. Вы можете использовать его для обработки события пресс-строки или через раскадровку. В раскадровке вы можете управлять перетаскиванием из строки табличного представления в другой контроллер представления, чтобы настроить segue, в этом сценарии вам даже не нужно использовать didSelectRowAtIndexPath: method, prepareForSegue: достаточно, если вам нужно передать некоторые данные между контроллерами представления. Другой способ - перетаскивание элемента управления из контроллера табличного представления (не строки) в другой контроллер представления. В этом случае вам нужно как-то назвать этот переход. Я полагаю, что вы создали свой путь по-другому. Чтобы вызвать его при нажатии на строку, добавьте эту строку в didSelectRowAtIndexPath: метод, замените комментарий из кода выше на:

[self performSegueWithIdentifier:@"YOURSEGUENAMEFORMSTORYBOARD" sender:nil]

// РАСПРОСТРАНЕНИЯ

Если вы хотите передать данные в другое представление, вы можете использовать второй параметр - отправитель. Вы можете передать туда требуемый объект или любой другой объект, например:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //I pass NSIndexPath to prepare for segue
        [self performSegueWithIdentifier:@"YOURSEGUENAMEFORMSTORYBOARD" sender: indexPath]
    }

А в prepareForSeque: метод вы можете получить этот объект и использовать его:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"viewGallery"]){
        flickrGalleryViewController *controller = (flickrGalleryViewController *)segue.destinationViewController;
        // HERE I retrieve index path from parameter
        NSIndexPath *indexPath = (NSIndexPath*)sender;
        controller.photoids = [photoids objectAtIndex:indexPath.row];
        NSLog(@"photoid = %@", controller.photoids);
    }
}

Это пример, который вы можете изменить.

Другие вопросы по тегам