Условная навигация Segue от UITableViewCell на основе ответа на UIAlertView - PullRequest
6 голосов
/ 17 декабря 2011

Моя проблема выглядит как общая проблема, но не могу найти ответ на нее.

У меня есть ситуация, когда пользователь нажимает на пользовательский UITableViewCell, я хотел бы показать предупреждениеи затем, основываясь на ответе на предупреждение, либо оставайтесь в том же виде (пользователь выбирает отмену), либо отображают другой вид (если пользователь выбирает продолжить).И я хотел бы сделать это, используя функцию раскадровки и сегменты.

Как можно это сделать?Вы должны сделать это по старинке?

Ответы [ 3 ]

11 голосов
/ 17 декабря 2011

@ user, просто создайте alertView по старинке;Я знаю любую функцию раскадровки, чтобы сделать это по-другому.Где раскадровка может помочь, это с segues.Вы можете вызвать segues программно.С помощью кнопки «Просмотреть оповещение» вы можете просто вернуться (т.е. ничего не делать).Для другой опции, чтобы отобразить другое представление, вы можете программно вызвать переход для перехода к нужному представлению.Если на вашей раскадровке по какой-то другой причине еще не определен правильный переход, просто создайте кнопку и используйте ее для создания перехода и назовите ее.Назовите segue, щелкнув по нему в раскадровке, и используйте инспектор атрибутов, чтобы дать ему имя (идентификатор).Затем спрячьте кнопку или уберите ее из поля зрения.Обычно я помещаю кнопки такого типа на панель инструментов и использую проставки, чтобы они не были видны.Вот некоторый пример кода:

Вызовите segue из делегата представления предупреждений следующим образом:

[self performSegueWithIdentifier: @"done" sender: self];

Также реализуйте этот метод, чтобы выполнить любую необходимую задачу для подготовки к segue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"done"]) 
    {
        //    [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
        //    [[segue destinationViewController] setSelectedClient:selectedClient];
    }
}
8 голосов
/ 31 декабря 2011

Вы можете создавать сегменты непосредственно от начального ViewController для нескольких destinationViewController, которые затем можно «программно» выполнять.Вам не нужно создавать для них скрытых кнопок, что выглядит как взлом.

4 голосов
/ 02 мая 2012

ОК. Я нашел решение в соответствии с раскадровкой, которая мне нравится.

Пример:

В моем табличном представлении есть 2 секции, сгруппированные и ячейки являются динамическими прототипами Раздел 0 содержит одну строку / UITableViewCell, и я не хочу, чтобы он переходил. Раздел 1 содержит несколько ячеек, которые я хочу запустить и перейти к деталям.

В раскадровке:

  • Я удалил последовательность, связывающую ячейку просмотра таблицы с контроллером представления назначения.
  • Я сделал «общий» переход, связывающий контроллер представления источника напрямую с контроллером представления назначения.
  • В атрибутах перехода я установил идентификатор ('EditTimePeriod') и установил тип на Push (я предполагаю, что Modal будет работать точно так же).

В контроллере вида источника:

  • В методе prepareForSegue я работал как с общим этапом AddTimePeriod, перетаскиваемым с помощью элемента управления из моего UIBarButtonItem (Add), так и с общим вызовом EditTimePeriod (vc -> vc) EditTimePeriod.

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
        // handle the click of the 'Add' bar button item    
        if([segue.identifier isEqualToString:@"AddTimePeriod"]) {
            TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController;
            tpvc.delegate = self;
            // database & entity stuff for adding the new one to the mOC, etc
        }
    
        // handle the click of one of the 'editable' cells - 
        if([segue.identifier isEqualToString:@"EditTimePeriod"]) {
            TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController;
            tpvc.delegate = self;
            TimePeriod * newTP = [self.timePeriodArray objectAtIndex:self.tableView.indexPathForSelectedRow.row];
            tpvc.timePeriod = newTP;
        }
    }   
    
  • Затем я реализовал метод tableView: didSelectRowAtIndexPath и поместил мое условие здесь. Если выбранная строка находилась за пределами нулевого раздела, я вызывал sege EditTimePeriod вручную, определяя отправителя как выбранную ячейку просмотра таблицы:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
        if(self.tableView.indexPathForSelectedRow.section!=0){
            [self performSegueWithIdentifier:@"EditTimePeriod" sender:[tableView cellForRowAtIndexPath:indexPath]];
        }
    
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    
        return;    
    }
    

было бы неплохо закодировать ячейку в разделе 0, чтобы ее нельзя было выбрать в первую очередь! Надеюсь, это поможет.

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

...