Xcode 4.2 iOS 5: несколько сегментов из UITableView - PullRequest
10 голосов
/ 11 января 2012

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

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

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

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

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

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

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

Ответы [ 3 ]

25 голосов
/ 15 января 2012

Определите два «общих» сегмента (например, идентифицированных как «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];
    }
}
16 голосов
/ 30 мая 2012

У меня такая же проблема, как и у вас. Проблема в том, что вы не можете связать свой 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];
        }
    }
    
0 голосов
/ 25 июля 2014

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

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

viewDidLoad

- (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];
}
...