Уволить UI лист действий - сбой - PullRequest
2 голосов
/ 01 октября 2010

У меня "снова" ;-) проблема, которую я не могу решить.

Мое приложение запускается на tableView. Когда я выбираю ячейку, я перехожу к «detailView». На этом экране я добавляю две кнопки на панель инструментов следующим образом:

UIToolbar* tools = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 115, 44.01)];  
// tab where buttons are stored
NSMutableArray* buttons = [[NSMutableArray alloc] init];    
UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStylePlain target:self action:@selector(nextEdit)];
UIBarButtonItem *btn2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(popupActionSheet)];
btn.style=UIBarButtonItemStyleBordered;
btn2.style = UIBarButtonItemStyleBordered;
[buttons addObject:btn];
[buttons addObject:btn2];
// add buttons to the toolbar
[tools setItems:buttons animated:YES];  

// add buttons within "tools" to the view   
    UIBarButtonItem *btn3 = [[UIBarButtonItem alloc] initWithCustomView:tools];
    self.navigationItem.rightBarButtonItem = btn3;  
    [buttons release];  

    [btn release];  
    [btn2 release]; 
    [btn3 release];
    [tools release];

Как только я нажимаю на кнопку корзины, я вызываю метод "popupActionSheet", чтобы появилось всплывающее окно "Подтвердить удаление":

-(void)popupActionSheet {   
isActiveSupr=(BOOL)YES;
UIActionSheet *popupQuery = [[UIActionSheet alloc]
                             initWithTitle:@"Delete ? "
                             delegate:self                               
                             cancelButtonTitle:@"Cancel"
                             destructiveButtonTitle:@"Confirm"
                             otherButtonTitles:nil ,nil];

popupQuery.actionSheetStyle = UIActionSheetStyleBlackOpaque;
[popupQuery showInView:self.tabBarController.view];
[popupQuery release];
}

Затем, когда я нажимаю на destructiveButtonTitle: @ «Подтвердить», всплывающее окно «Подтвердить удаление» отклоняется и вызывает:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex 
{ 
    if(isActiveSupr==TRUE)
{
    if(buttonIndex==0)
    {
        [self send_requestDelete];            
    }
}
 }

- (void)send_requestDelete:
{
... //nothing to do with popup
[self showActionsheet:@"Demand deleted"];
[self.navigationController popToRootViewControllerAnimated:YES];
... // nothing to do with popup
}

-(void) showActionsheet :(NSString *)msg
{
UIActionSheet *popupQuery = [[UIActionSheet alloc]
                             initWithTitle:msg
                             delegate:self                               
                             cancelButtonTitle:@"OK"
                             destructiveButtonTitle:nil
                             otherButtonTitles:nil ,nil];
popupQuery.actionSheetStyle = UIActionSheetStyleBlackOpaque;
[popupQuery showInView:self.tabBarController.view];
[popupQuery release];
}

Пока я возвращаюсь к своему tableViewController, появляется всплывающее окно ("showActionsheet: @" Требование удалено "];").

Если я нажимаю «ОК», мое приложение вылетает. Если я отключаю это всплывающее окно ("showActionsheet"), все в порядке.

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

Спасибо за помощь.

1 Ответ

0 голосов
/ 02 октября 2010

Прежде всего, вы установили точки останова для исключений objc_exception_throw и [NSException повышение]?

Кроме того, поскольку ActionSheet добавляется в подпредставление, и сразу после этого вы делаете это:

[self.navigationController popToRootViewControllerAnimated:YES];

Таблица действий не является модальным диалоговым окном или чем-то еще, и в это время он не будет блокировать вызов других функций.

Что может помочь, если вы сделали что-то вроде следующего:

-(void)popupActionSheet 
{   
    isActiveSupr=(BOOL)YES;
    UIActionSheet *popupQuery = [[UIActionSheet alloc]
                                 initWithTitle:@"Delete ? "
                                 delegate:self                               
                                 cancelButtonTitle:@"Cancel"
                                 destructiveButtonTitle:@"Confirm"
                                 otherButtonTitles:nil ,nil];
    popupQuery.tag = 1;
    popupQuery.actionSheetStyle = UIActionSheetStyleBlackOpaque;
    [popupQuery showInView:self.tabBarController.view];
    [popupQuery release];
}

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex 
{ 
    if (actionSheet.tag == 1)
    {
        if(buttonIndex==0)
        {
            [self send_requestDelete];            
        }
    }
    else if (actionSheet.tag == 2)
    {
        [self.navigationController popToRootViewControllerAnimated:YES];
    }
}

- (void)send_requestDelete:
{
    ... //nothing to do with popup
    [self showActionsheet:@"Demand deleted"];
    ... // nothing to do with popup
}

-(void) showActionsheet :(NSString *)msg
{
    UIActionSheet *popupQuery = [[UIActionSheet alloc]
                                 initWithTitle:msg
                                 delegate:self                               
                                 cancelButtonTitle:@"OK"
                                 destructiveButtonTitle:nil
                                 otherButtonTitles:nil ,nil];
    popupQuery.tag = 2;
    popupQuery.actionSheetStyle = UIActionSheetStyleBlackOpaque;
    [popupQuery showInView:self.tabBarController.view];
    [popupQuery release];
}

Таким образом, метод didDismissWithButtonIndex знает, какой лист действий фактически использовался и каким должно быть следующее действие.

Вы никогда не должны удалять представление, когда продолжаете работать над ним, как вы.

...