Как правильно закрыть UIPopover? - PullRequest
0 голосов
/ 22 февраля 2011

Я добавил UIPopover к моей панели навигации, когда пользователь касается правой кнопки.Я хочу знать, что самое чистое кодирование для показа и отклонения поповера.С кодом ниже, это работает, но не правильно.Если пользователь сначала коснется правой кнопки, появится всплывающее окно.Теперь он может выбрать ячейку, .. работает.Или вы можете коснуться за пределами поповер, и он исчезнет.В обоих направлениях правильно.

Но при прикосновении к правому значку кнопки и после этого, снова прикоснувшись к этому значку, нужно дважды прикоснуться к нему, чтобы снова вызвать этот поповер.(Не при первом касании).

Как должна выглядеть эта правильная функция?Спасибо за ваше время ..

 -(void) downloads:(UIBarButtonItem*)button{
        NSLog(@"downloads");
        if(tableViewController == nil) {
        tableViewController = [[[TableViewController alloc] initWithStyle:UITableViewStylePlain] autorelease];

        self.popoverController = [[[UIPopoverController alloc] initWithContentViewController:tableViewController]autorelease] ;
        [self.popoverController presentPopoverFromBarButtonItem:barButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
        tableViewController.delegate = self;
        }else {
            [self.popoverController dismissPopoverAnimated:NO];
            tableViewController.delegate = nil;
            tableViewController = nil;
            //[self.popoverController release];
            //self.popoverController = nil;
        }
    }

    //delegate
    -(void) selectedTable:(NSString*)text{
        NSLog(@"selectedTable: %@", text);
         [self.popoverController dismissPopoverAnimated:YES];
    }

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Комментарии

Ваш метод downloads: проверяет значение tableViewController и принимает решение, должен ли UIPopoverController отображаться или отклоняться.Но ваш selectedTable: метод отклоняет popoverController и не устанавливает tableViewController на ноль, поэтому он не работает так, как вы ожидаете.

И я также не вижу реализации UIPopoverControllerDelegate, особенноpopoverControllerDidDismissPopover:, который сообщит вам, когда UIPopoverController был отклонен (например, нажав за пределами вашего UIPopoverController).

Управление памятью

Прочтите руководство по управлению памятью.[self.popoverController release] с self.popoverController = nil приводит к сбою - один выпуск и второй выпуск при установке на ноль.(Я предполагаю, что ваше popoverController свойство сохраняется).

0 голосов
/ 22 февраля 2011

@ В основном Иззи: Спасибо за вашу помощь. Вы указываете мне в правильном направлении. Вот код, который я использую. Работает отлично. Надеюсь, что управление памятью тоже чистое. Не правда ли?

-(void) downloads:(UIBarButtonItem*)button{

    if([self.popoverController isPopoverVisible])
    {   
        [self.popoverController dismissPopoverAnimated:YES];
        [self.popoverController.delegate popoverControllerDidDismissPopover:self.popoverController];
        return;
    }

    // PopOver Bookmarks-Icon
    if(tableViewController == nil) {

        tableViewController = [[PdfTableViewController alloc] initWithStyle:UITableViewStylePlain]; //autorelease];

        self.popoverController = [[UIPopoverController alloc] initWithContentViewController:tableViewController]; //autorelease] ;
        [self.popoverController presentPopoverFromBarButtonItem:barButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

        popoverController.delegate = self;
        tableViewController.delegate = self;
    }
    /* Using "isPopoverVisible" from top or that else. both works
     else {
        [self.popoverController dismissPopoverAnimated:YES];
        [self.popoverController.delegate popoverControllerDidDismissPopover:self.popoverController];
    }
    */  
}

-(void) selectedTableView:(NSString*)text{
    NSLog(@"selectedTableView: %@", text);

    [self.popoverController dismissPopoverAnimated:YES];
    [self.popoverController.delegate popoverControllerDidDismissPopover:self.popoverController];
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popover{
    NSLog(@"popoverControllerDidDismissPopover");

    tableViewController.delegate = nil;
    [tableViewController release];
    tableViewController = nil;

    popoverController.delegate = nil;
    [popoverController release];
    popoverController = nil;
}
...