Xcode 4.2 iOS 5: несколько переходов из UITableView

Сейчас я начинаю с Xcode на 4.2 для iOS5, и есть несколько изменений, и теперь я столкнулся с проблемой, которую не могу найти, как ее решить.

Я делаю пример с UITablwView, который программно заполняется двумя разделами, 1-й раздел только с 1 строкой и 2-й раздел с 3 строками.

Моя цель - выбрать строку из таблицы, и на основе этой строки пользователь будет перенаправлен на разные представления.

Например: выбор раздела 0, строка 0, приложение отправляет на просмотр 1 — настройка имени // выбор раздела 1, строка 0, приложение отправляет на просмотр 3 — настройка адреса

По старинке, это довольно просто, нужно просто инициировать UIViewController с помощью initWithNibName, а затем отправить представление.

Теперь с StoryBoard все меняется, или, по крайней мере, я думаю, что это меняется, потому что я не вижу, как получить тот же результат, так как я не могу установить несколько переходов из tableView в разные UIViewControllers... и делать по старинке Я не вижу, где я могу получить имена NIB из представлений на StoryBoard, чтобы инициировать UIViewController для нажатия.

Кто-нибудь знает, как получить этот результат??


person user1141673    schedule 10.01.2012    source источник


Ответы (3)


Определите два «общих» перехода (например, обозначенные как «segue1» и «segue2») в раскадровке от исходного контроллера представления, по одному для каждого целевого контроллера представления. Эти переходы не будут связаны с каким-либо действием.

Затем условно выполните переходы в вашем UITableViewDelegate:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Conditionally perform segues, here is an example:
    if (indexPath.row == 0)
    {
        [self performSegueWithIdentifier:@"segue1" sender:self];
    }
    else
    {
        [self performSegueWithIdentifier:@"segue2" sender:self];
    }
}
person Marco    schedule 15.01.2012
comment
Фантастический ответ. Работает и для меня. Должен быть принят как ответ. - person mm24; 22.02.2014

У меня такая же проблема, как и у вас. Проблема в том, что вы не можете связать свой tableViewCell с несколькими контроллерами представления. Однако вы можете связать свое само исходное представление с несколькими контроллерами представления.

  1. Удерживая нажатой клавишу Control, перетащите главный контроллер представления (вместо ячейки табличного представления) из средства просмотра сцен на любой контроллер представления, который вы хотите связать. Вы можете делать это столько, сколько хотите. Обратите внимание, что переход, показанный в сцене контроллера представления исходного кода, должен быть чем-то вроде «Push Segue from Root View Controller…» вместо «Push Segue from NavCell to…».

  2. Идентифицируйте каждую ссылку перехода уникальным именем, например «toDetailView1».

  3. Наконец, настройте выбор в контроллерах представления исходного кода:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row % 2 == 1) {
            [self performSegueWithIdentifier:@"toDetailView1" sender:self];
        } else {
            [self performSegueWithIdentifier:@"toDetailView2" sender:self];
        }
    }
    
person 陳仁乾    schedule 30.05.2012
comment
Удивительный! Решил мою проблему! Один вопрос... Как я могу использовать одно и то же для более чем двух переходов. Допустим, у меня есть 7 ячеек tableView. Как бы я использовал это в дополнение к коду, который вы предоставили? - person Steve Sahayadarlin; 20.06.2014

Как объяснили @陳仁乾 и @Marco, это было совершенно правильно. Чтобы сделать все немного проще, я бы порекомендовал вам использовать один NSArray, который будет инициализирован, когда viewDidLoad. Просто назовите переходы так же, как ваш UIViewControllers, таким образом вы сможете отобразить правильное описание того, что UIViewControllers вы можете выбрать, и вы также можете выполнить segues из этого NSArray:

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

просмотрDidLoad

- (void)viewDidLoad
{
    [super viewDidLoad];

    _arraySessions = [[NSArray alloc] initWithObjects:
                      @"MyViewControllerName", nil];
}

cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = 
     [tableView dequeueReusableCellWithIdentifier:@"overviewCell"
                                     forIndexPath:indexPath];

    [cell.textLabel setText:_arraySessions[indexPath.row]];

    return cell;
}

didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView 
        didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [self performSegueWithIdentifier:_arraySessions[indexPath.row] 
                              sender:self];
}
person Alex Cio    schedule 25.07.2014