Подтвердить что ты не робот

Условный сегмент выполняется при нажатии на UITableViewCell

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

4b9b3361

Ответ 1

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

Ответ 2

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

  • обнаружено касание в ячейке
  • выполняется segue

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

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

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

Обратите внимание, что вам также необходимо идентифицировать свою ячейку, чтобы вы знали, был ли выбран тот, который вас интересует. Вы могли бы это сделать, зная путь индекса в статической таблице, но я предпочитаю устанавливать уникальный идентификатор ячеек в 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 what the normal
        // segue does and I already had code counting on that
        [self performSegueWithIdentifier:@"SegueIdentifer" sender:cell];
    }
}

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

Ответ 3

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

  • Если вы создаете segue в раскадровке ctl + перетаскиваете из SomeVC в AnotherVC, удалите его.

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

  • Внесите tableView: didSelectRowAtIndexPath:, как описано выше.

  • Мне было удобно использовать оператор 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;
    

    }

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

Ответ 4

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

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