Условный переход выполняется при нажатии на UITableViewCell - PullRequest
39 голосов
/ 30 октября 2011

Я работаю над проектом для iOS 5 с использованием Xcode 4.2.У меня есть один UITableViewController, и я хочу выполнить переход, когда пользователь нажимает на ячейку таблицы, но контроллер представления назначения зависит от действий, выполняемых над этой ячейкой.Например, когда пользователь нажимает на ячейку, я хотел бы загрузить SomeViewController, но когда пользователь нажимает на эту же ячейку в режиме редактирования, я хотел бы загрузить AnotherViewController.К сожалению, в сборщике раскадровок Xcode 4.2 нет способа настроить несколько сегментов в одной ячейке, или я просто не понимаю.Возможно, есть способ создать переход вручную, в редакторе кода.Обычно я хочу предоставить пользователю способ «ввести» элемент, представленный ячейкой, с использованием одного контроллера представления, и «отредактировать» элемент, представленный той же ячейкой, с помощью другого контроллера представления.Хотя переключение на второй контроллер представления (редактор) только в режиме редактирования таблиц было моим первым, но, возможно, есть лучший способ.Любая помощь будет оценена.

Ответы [ 4 ]

54 голосов
/ 23 ноября 2011

Просматривая раскадровку, перетащите элемент управления из исходного контроллера вида на контроллер вида назначения.Это создаст переход, который вы можете запускать программно прямо из вашего исходного View Controller.Убедитесь, что вы дали Segue имя.Это имя, которое вы передадите в executeSegue: withIdentifier: метод исходного контроллера представления.

33 голосов
/ 01 ноября 2012

Я добавляю дополнительный ответ только потому, что после прочтения выбранного выше во многих местах, кроме этого - и он является правильным ответом - я обнаружил, что задаюсь вопросом, как обнаружить касание, которое обычновызвать переход.Видите ли, если вы создадите свой переход обычным способом путем перетаскивания Ctrl из ячейки табличного представления на следующий контроллер, то для вас автоматически будут выполнены две вещи:

  1. обнаружено касание в ячейке
  2. переход выполняется

но, конечно, вы не можете заблокировать переход.

Теперь, если вы хотите условно переходзатем (как упоминалось в других ответах) вы удаляете этот переход и создаете новый из UITableViewController (перетаскиваете его из навигатора объектов, а не раскадровки) на следующий контроллер - и присваиваете ему имя.

Затем - и это та часть, которую мне не хватало - внедрите tableView:didSelectRowAtIndexPath в своем контроллере табличного представления для программного и условного выполнения перехода, как показано ниже.

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Find the selected cell in the usual way
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    // Check if this is the cell I want to segue from by using the reuseIdenifier
    // which I set in the "Identifier" field in Interface Builder
    if ([cell.reuseIdentifier isEqualToString:@"CellIWantToSegueFrom"]) {

    // Do my conditional logic - this was the whole point of changing the segue
    if (myConditionForSegueIsSatisfied) {
        // Perform the segue using the identifier I was careful to give it in IB
        // Note I'm sending the cell as the sender because that's what the normal
        // segue does and I already had code counting on that
        [self performSegueWithIdentifier:@"SegueIdentifer" sender:cell];
    }
}

Обратите внимание, как я отправляю ячейку с переходом - нормальный переход из ячейкиделает это, и я изначально передал ноль, и мой код, который зависел от него, перестал работать.

5 голосов
/ 12 марта 2015

Это старый вопрос и некоторые отличные правильные ответы но я опубликую некоторую дополнительную информацию, которая мне показалась полезной, когда я столкнулся с этим:

  1. Если вы создадитепереход в раскадровке ctl + перетащить из SomeVC в AnotherVC, удалите его.

  2. В навигаторе объектов ctl + перетащите на уровне ViewController (обычно сначала в иерархии под именем VC) из SomeVC в AnotherVC.Присвойте sege уникальный идентификатор.

  3. Реализуйте tableView: didSelectRowAtIndexPath:, как описано выше.

  4. Я нашел полезным использовать оператор switchв tableView: didSelectRowAtIndexPath:

    switch (indexPath.row) {
    case 0:
        [self performSegueWithIdentifier:@"yourIDHere" sender:self];
        break;
    case 1:
        // enter conditional code here...
        break;
    case 2:
        // enter conditional code here...
        break;
    // ... for however many cells you require
    
    default:
        break;
    

    }

Спасибо за отличные ответы всем.

0 голосов
/ 15 февраля 2016

Вы можете легко контролировать открытие любого перехода в вашем пользовательском UIViewController, выполнив:

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool { return true // or false, depending on what you need }

...