2012-01-10 5 views
10

Я начинаю теперь с Xcode 4.2 для iOS5, и есть несколько изменений, и теперь я перехожу к проблеме, и я не могу найти способ ее решить ,Xcode 4.2 iOS 5: множественные segues из UITableView

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

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

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

старого способа моды адреса, это достаточно просто, просто нужно запустить UIViewController с initWithNibName, а затем нажать вид.

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

Кто-нибудь знает, как добраться до этого результата?

ответ

25

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

Тогда, условно выполнять перетекает в вашем 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]; 
    } 
} 
+2

Фантастический ответ. Работает и для меня. Должен приниматься как ответ. – mm24

16

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

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

  2. Определить каждое звено SEGUE уникального имя, как "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

+1 решила мою проблему –

+0

Удивительно! Решила мою проблему! Один вопрос ... Как я могу использовать одно и то же для более чем двух segues. Предположим, что у меня 7 ячеек таблицы. Как я буду использовать это в дополнение к коду, который вы предоставили? –

0

Как @ 陳仁 乾 и @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]; 
}