Xcode 4.2 iOS 5: множественные выделения из UITableView

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

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

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

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

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

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

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

Ответ 1

Определите два "общих" 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

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

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

  • Определите каждую ссылку segue уникальное имя, например "toDetailView1"

  • Наконец, пользовательский выбор в контроллерах исходного кода:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row % 2 == 1) {
            [self performSegueWithIdentifier:@"toDetailView1" sender:self];
        } else {
            [self performSegueWithIdentifier:@"toDetailView2" sender:self];
        }
    }
    

Ответ 3

Подобно @陳仁 乾 и @Marco объяснил, что это абсолютно правильно. Чтобы сделать все немного проще, я бы рекомендовал использовать один NSArray, который будет инициализирован, когда viewDidLoad. Просто назовите segues так же, как и ваш 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];
}