Как предотвратить переход управления в другой UIView, когда UIPopover отображается из UITableView?

У меня есть приложение для iPad (XCode 5.1.1, iOS 7.1, ARC и раскадровки). У меня есть UITableView, который вызывает другие UIViews и UITableViews. (oServicesCell показан на изображении ниже)

UITableView

Обычно, когда пользователь нажимает на строку «Службы», я отображаю еще 4_ данных. Однако бывают случаи, когда мне нужно отобразить UIPopover, а не `UITableView.

Это код, который я использую, и он работает, но якорь исчезает, когда отображается обычный UITableView (также отображается UIPopover... Я вижу его перед сбоем приложения с помощью -[UIPopoverController Dealloc] достигнут, пока всплывающее окно все еще видно.).

#pragma mark prepareForSegue
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

if ([segue.identifier isEqualToString:@"segueStartTime"]) {
    DateTime *dt = (DateTime *)segue.destinationViewController;
dt.whichTextField = @"oStartTime";
}
else if ([segue.identifier isEqualToString:@"segueEndTime"]) {
    DateTime *dt = (DateTime *)segue.destinationViewController;
    dt.whichTextField = @"oFinishTime";
}
else if ([segue.identifier isEqualToString:@"segueFromServices"]) {

    SingletonServicesType *sharedInstance = [SingletonServicesType sharedServicesType];

    //  initialize
    UIViewController* popoverContent = [[UIViewController alloc] init];
    UIView *popoverView;
    SZTextView *activityField;
    UIPopoverController *popoverController;

    if([sharedInstance.globalServicesType  isEqual: @3])  {  //  "manual entry"?
        popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 250, 150)];  //  was 216
        popoverContent.preferredContentSize = CGSizeMake(250.0, 150.0);

        activityField = [[SZTextView alloc] init];
        activityField.frame =  CGRectMake(0, 0, 250, 150);

        activityField.placeholder = NSLocalizedString(@"Enter your activity for this appointment only",nil);
        [activityField becomeFirstResponder];

        //  add it to the popover
        popoverContent.title = NSLocalizedString(@"manual",nil);
        [popoverView addSubview:activityField];
        popoverContent.view = popoverView;


        //  if previous popoverController is still visible... dismiss it
        if ([popoverController isPopoverVisible]) {
            [popoverController dismissPopoverAnimated:YES];
        }

        popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
        popoverController.delegate = (id)self;

        [popoverController setPopoverContentSize:CGSizeMake(250, 150) animated:NO];

        //  show it
        [popoverController presentPopoverFromRect: oServicesCell.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];

    }
}
}

Как предотвратить передачу управления UITableView? Все, что я хочу сделать, это отобразить UIPopover.


person SpokaneDude    schedule 12.05.2014    source источник


Ответы (1)


-[UIPopoverController Dealloc] достигнут, пока всплывающее окно все еще видно.

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

В приведенном выше коде у вас есть локальная переменная для контроллера popover, которая будет освобождена, когда метод завершится. Вместо этого имейте свойство для любого класса, который находится выше, который будет удерживать всплывающее окно столько времени, сколько потребуется — вы можете установить свойство равным nil в методе делегата всплывающего окна, когда оно закрывается.

Другой вашей проблемой является ограничение раскадровки - вы не можете связать два разных перехода из одного и того же (выбор ячейки). Вероятно, проще всего было бы реализовать - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender на контроллере представления — если вы показываете таблицу, верните YES, иначе покажите всплывающее окно. К тому времени, когда он дойдет до prepareForSegue, будет слишком поздно — вы покажете всплывающее окно и выполните переход.

person jrturton    schedule 13.05.2014
comment
Спасибо... ваше предложение работает, но мне не нравятся результаты (исходный UITableView все еще виден, что делает его беспорядочным). Итак, я собираюсь попробовать что-нибудь еще. Еще раз спасибо, я ценю ваше время. - person SpokaneDude; 13.05.2014
comment
О, я думал, вы имели в виду всплывающее окно над представлением таблицы. Иначе откуда возьмется всплывающее окно? - person jrturton; 13.05.2014