Переход к UITableView в зависимости от выбора строки

У меня есть UITableView, который содержит массив из 3 элементов. После выбора пользователя мне нужно, чтобы каждый из этих трех элементов переходил к другому UITableView. Например:

Первая сцена — это таблица, содержащая список: погода, разведданные, статус топлива. Вторая сцена:

Когда пользователь выбирает погоду, переходите к таблице, которая содержит массив «ежедневные карты, потенциал возгорания и т. д.». Когда пользователь выбирает интеллект, перейдите к таблице, содержащей массив «текущие активные пожары, новые начальные атаки и т. д.».

и так далее.

Мне сказали, что я могу использовать разные UITableViewCells для каждой ячейки прототипа, но я уверен, что есть более простой способ, который я просто не понимаю. Все текущие переходы были сделаны в раскадровке. Может ли кто-нибудь объяснить, как мне следует переходить от сцены к сцене (на начальном-среднем уровне понимания)?

Корень

#import "PSMenu_TableViewController.h"
#import "WXMenu_TableViewController.h"
#import "PSTableViewCell.h"

@interface PSMenu_TableViewController ()

@end

@implementation PSMenu_TableViewController
@synthesize PSMenuImage = _PSMenuImage;
@synthesize PSMenuText = _PSMenuText;


- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.PSMenuText = [[NSArray alloc]
                  initWithObjects:@"Weather",
                  @"Intelligence",
                  @"Fuels Status",
                  nil];

    self.PSMenuImage = [[NSArray alloc]
                  initWithObjects:@"RMACC_114x114.png",
                  @"RMACC_114x114.png",
                  @"RMACC_114x114.png",
                  nil];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"rootTableCell";

    PSTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == 0) {
        cell = [[PSTableViewCell alloc]
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    cell.rootLabel.text = [self.PSMenuText
                           objectAtIndex: [indexPath row]];

    UIImage *rootPhoto = [UIImage imageNamed:
                          [self.PSMenuImage objectAtIndex: [indexPath row]]];

    cell.rootImage.image = rootPhoto;

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Use indexPath to retrieve info that needs to be passed along to next view controller
    [self performSegueWithIdentifier:@"getWeather" sender:self];
}


@end

Один из файлов .m, к которому я пытаюсь перейти:

#import "WXMenu_TableViewController.h"
#import "DWO_TableViewController.h"


@interface WXMenu_TableViewController ()

@end

@implementation WXMenu_TableViewController
{
//Define array for weather products list
    NSArray *allwx;

}

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    //Define the weather products list
    allwx = [NSArray arrayWithObjects:@"Daily Weather", @"Fire Potential", @"Multi-Media Briefing", @"Sig. Fire Potential",@"Seasonal Outlook", @"Fire Season Broadcast", nil];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Set table size to one section.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //When Weather is clicked on previous VC, the allwx list is displayed
    if ([_weathertable isEqualToString:@"Weather"]) {
        return [allwx count];
    }
    return 0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *pstableID = @"MainCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:pstableID];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:pstableID];
    }

    if ([_weathertable isEqualToString:@"Weather"]) {
        cell.textLabel.text = [allwx objectAtIndex:indexPath.row];
    }

    return cell;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
    if ([segue.identifier isEqualToString:@"showDWODetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        DWO_TableViewController *destViewController = segue.destinationViewController;
        destViewController.dailywxtable = [allwx objectAtIndex:indexPath.row];
        destViewController.title = destViewController.dailywxtable;
    }
}

@end

person jclark754    schedule 11.06.2014    source источник
comment
Посмотрите это для более элегантных методов: stackoverflow.com/questions/12303485/   -  person Yushan ZHANG    schedule 14.12.2016


Ответы (2)


Здесь вы можете перейти к одному UITableViewController и заставить его отображать соответствующее содержимое в соответствии с выбранной категорией. Это может помочь вам.

В вашем целевом контроллере представления вы можете объявить переменную и использовать ее в своем методе prepareForSegue, как показано, чтобы определить, какой тип контента вы хотите видеть на целевом контроллере представления.

destController.varName = @"setYourTypeHere";

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

И в вашем контроллере Destination View вы можете проверить это значение, используя switch или if...else случаи, и привязать соответствующие данные в соответствии с вашими требованиями.

person Matt Murdock    schedule 11.06.2014
comment
Это привело меня на правильный путь, хотя я все еще не уверен, как выполнять разные переходы для каждого значения в моем основном массиве с одной ячейкой-прототипом. Я не могу перейти более одного раза из ячейки-прототипа. Кроме того, как мне создать оператор if/else для переходов? - person jclark754; 11.06.2014
comment
На самом деле будет только один переход к целевому контроллеру представления. Вам просто нужно поиграть со значением переменной, чтобы проверить, какой тип контента вам нужен. Поэтому, когда ваш prepareForSegue вызывается, просто передайте соответствующее значение в переменной и проверьте это значение на стороне назначения. Сделайте случай переключения или если... еще для этих значений. - person Matt Murdock; 11.06.2014
comment
Поэтому у меня должно быть три отдельных оператора перехода в моем корневом контроллере с именами переменных, такими как информация о погоде и статус топлива. Затем, в моей следующей сцене, UITableViewController, я бы включил массивы для каждой из таблиц, которые я хочу создать, на основе этих трех элементов. Что происходит, когда я хочу, чтобы одна или несколько таблиц основывались на новой сцене? Как настроить действие prepareForSegue для включения каждого элемента массива? - person jclark754; 11.06.2014
comment
Нет. Пусть будет только один переход. Возьмите переменную NSString в целевом контроллере и поиграйте с этими именами переменных, используя эту переменную, как я объяснил в своем ответе. В общем, это похоже на любую ячейку, которую вы нажмете в списке, переход будет одинаковым, и он приведет вас к тому же самому. назначения, но тип данных, запрошенных этой переменной, изменится. - person Matt Murdock; 11.06.2014
comment
Ух ты. Прости, что я так зациклился на чертовых сеге! Спасибо за вашу помощь! Это должно работать нормально. - person jclark754; 11.06.2014
comment
Рад, что это помогло вам. :) - person Matt Murdock; 12.06.2014

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

Назовите каждый переход осмысленным именем, а затем в методе делегата «didSelect» вы можете выполнить переход, используя:

[self performSegueWithIdentifier:@"myNamedSegue" sender:self];
person Joshua Jackson    schedule 02.04.2015