#iphone #objective-c #xcode #crash #uiactionsheet
#iPhone #objective-c #xcode #сбой #uiactionsheet
Вопрос:
У меня «снова» 😉 проблема, которую я не могу решить.
Мое приложение запускается в TableView. Когда я выбираю ячейку, я перехожу к «Просмотру деталей». В этом представлении я добавляю две кнопки на панель инструментов таким образом :
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. Можете ли вы опубликовать журнал сбоев..
Ответ №1:
Прежде всего, вы установили точки останова для исключений objc_exception_throw и [NSException raise]?
Также потому, что таблица действий добавляется в подвиде, и непосредственно после этого вы делаете это:
[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 узнает, какая таблица действий была фактически использована и каким должно быть следующее действие.
Вам никогда не следует удалять представление, когда вы все еще работаете над ним, как это делаете вы.
Комментарии:
1. спасибо Wim. Все работает нормально. Теперь просмотр запускается только тогда, когда я отклоняю второе всплывающее окно.