0

G'day,Представляя правильный экземпляр Vew контроллера в зависимости от выбора ячейки в UITableView

Я понимаю, что это может быть покрыта в частях в ответах на другие вопросы (ссылки см), которые я видел на сайте, но из-за мой ограниченный опыт я не смог понять каждую часть, поскольку это касается моего кода. Пожалуйста, простите меня за любые дублирования.

У меня есть PFQueryTableViewController (по существу, UITableViewController), который называется threadsViewController, который выводит информацию о ячейках из бэкэнда Parse. Вид таблицы состоит из потоков, похожих на то, что вы увидите на веб-форуме.

У меня тогда есть отдельный класс postsViewController, который является другим PFQueryTableViewController, который я хочу отобразить таблицу всех ответов ('posts') к этому конкретному потоку.

Функциональность, которую я ищу, предназначена для того, чтобы пользователь нажал на поток (левый экран на изображении), который должен быть представлен postsViewController (правый экран), содержащий только те сообщения/ответы, связанные с этим потоком. (См. Базовую диаграмму ниже).

Desired table view action

То, что я знаю из моих исследований:

  • синтаксический разбор бэкенда устанавливается с классами для Темы и сообщения.
  • Я, вероятно, буду использовать метод didSelectRowAtIndexPath делегата

Что мне нужна помощь с:

  • Как я могу знать, какой поток клетки пользователя постучал, а затем передать, что так, чтобы postsViewController отображал сообщения из этого потока?
  • описание неспециалиста о том, как использовать indexPath.row и т.д.

Я понимаю, как завершить PFQueries и т.д., чтобы получить данные для клеток, я просто не знаю, как осуществить навигацию и как сказать postsViewController, который сообщений.

В случае, если это помогает, вот моя реализация до сих пор. Я попробовал добавить свойство к postsViewController под названием fromThread, чтобы как-то сохранить эту тему, но кроме этого у меня нет идей!

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [super tableView:tableView didSelectRowAtIndexPath:indexPath]; 

    postsViewController *postsVC = [[postsViewController alloc] init]; 
    postsVC.fromThread = //? 
    [self performSegueWithIdentifier:@"threadsToPosts" sender:self]; 
} 

Благодарим вас за любую помощь, которую вы можете предоставить, и снова приносите свои извинения за любое дублирование.

Ссылки

How to filter a Parse query by an tableview index?

Pass Index Number between UITableView List segue

didSelectRowAtIndexPath and prepareForSegue implementation

ответ

0

Вы находитесь на правильном пути. Вам нужно знать, как сделать две вещи: (1) получить доступ к вашим синтаксическим объектам на indexPath и (2) нажать новый контроллер представления в навигационном контроллере.

(1) проще: PFQueryTableVC предоставляет метод под названием objectAtIndexPath:, который выполняет только то, что вам нужно.

// indexPath is the indexPath parameter to the didSelectRow delegate method 
PFObject *fromThread = [self objectAtIndexPath:indexPath]; 

(2) Простой, тоже. Но сложнее, потому что есть несколько способов сделать это. Segue - это более современный способ, но я думаю, что старый способ проще и, безусловно, проще описать в коде. Контроллерам просмотра предоставляются идентификаторы раскадровки на вкладке «Идентификация» в редакторе раскадровки. Дайте ваши сообщения, представляющие VC, идентификатор раскадровки, например «PostVC».

Чтобы получить новый экземпляр, используйте это раскадровка идентификатора следующим образом:

MyPostVC *postVC = [self.storyboard instantiateViewControllerWithIdentifier:@"PostVC"]; 
// initialize it with the PFObject we got above 
postVC.fromThread = fromThread; 

// present it on the navigation stack 
[self.navigationController pushViewController:postVC animated:YES]; 

fromThread И это только то, что PostVC нужно будет сформировать запрос для сообщений, связанных с выбранной темой.

+0

ты ученый и джентльмен. Спасибо вам большое за ваше время – northsydneybears

0

Вы можете передать данные клетки к следующему ViewController в prepareForSegue что-то вроде этого

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([segue.identifier isEqualToString:@"threadsToPosts"]) { 
     UINavigationController *navCon = segue.destinationViewController; 
     postsViewController *postsViewController = [navCon.viewControllers objectAtIndex:0]; 
     // Whatever you are populating your tableView with 
     Thread *thread = [self.thread objectAtIndex:self.tableView.indexPathForSelectedRow.row]; 
     postsViewController.thread = thread; 
    } 
} 
Смежные вопросы