Просмотр заблокирован после UIActionSheet или UIAlertView (iPhone / iPad) - PullRequest
1 голос
/ 14 января 2012

У меня проблемы с UIAlertView или UIActionSheet, когда я краду фокус и не отпускаю.

Чтобы уточнить, у меня есть настройка, при которой пользователь нажимает кнопку. Затем отобразится UIAlertView с UITextField. Когда пользователь нажимает кнопку «ОК», отображается UIActionSheet (вызывается из метода делегата UIAlertView), подтверждающее что-то с пользователем. Однако, когда они нажимают одну из кнопок, UIActionSheet исчезает, но фокус не возвращается к главному виду.

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

enter image description here

Пожалуйста, кто-нибудь может мне помочь?

Вот исходный код:

// This method displays the UIAlertView which contains a UITextView linked up to a
// UIPickerView.
- (IBAction)buttonPressed:(id)sender
{
    UIAlertView *deleteAlert = [[UIAlertView alloc] initWithTitle:@"Delete Something" 
                                                          message:@"Select something to delete:" 
                                                         delegate:self 
                                                cancelButtonTitle:@"Cancel" 
                                                otherButtonTitles:@"Ok", nil];
    deleteAlert.alertViewStyle = UIAlertViewStylePlainTextInput;
    deleteAlert.tag = kDeleteAlert;
    deleteTextField = [deleteAlert textFieldAtIndex:0];
    [pickerView reloadAllComponents];
    deleteTextField.inputView = pickerView;
    [deleteAlert show];
}


// The UIAlertView delegate method is then used to display a UIActionSheet to confirm
// whether the user wants to proceed.
- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex
{
    UIActionSheet *confirmDelete = [[UIActionSheet alloc] initWithTitle:@"Delete blah?" 
                                                               delegate:self 
                                                      cancelButtonTitle:@"No" 
                                                 destructiveButtonTitle:@"Yes" 
                                                      otherButtonTitles:nil];
    confirmDelete.actionSheetStyle = UIActionSheetStyleBlackOpaque;
    [confirmDelete showInView:self.parentViewController.tabBarController.view];
}

// Then the focus should be returned to the original view (i.e. where the first button
// was pressed to launch the UIAlertView. However the focus is still locked and the
// view appears slightly dimmed around the edges.
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{
    if (buttonIndex == actionSheet.destructiveButtonIndex) 
    {
        // Do some stuff ...
    }
}

Ответы [ 2 ]

2 голосов
/ 14 января 2012

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

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

Предположительно, вы хотите отключить представление предупреждений при представлении листа действий?Затем, когда лист действий отклонен, вы вернетесь к своему основному виду?Итак, порядок, который вы хотите:

1) Представить представление оповещения

2) Если кнопка в представлении оповещения нажата, она уведомляет своего делегата, используя - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

3) Отключить alertView - (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated и представить лист действий.

3) Когда лист действий используется, он вызывает метод делегата - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex и в этом методе отклоняет его или что-либо еще, что вам нужноделать.

Вы бы поместили все эти методы делегата в свой исходный вызывающий viewcontroller, сопоставив его с <UIAlertViewDelegate, UIActionSheetDelegate>.

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

Дополнительная информация http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAlertView_Class/UIAlertView/UIAlertView.html

0 голосов
/ 14 января 2012

Я бы сказал, что это вероятно из-за того, что вы не оставляете первого респондента на UITextField, который находится внутри UIAlertView.Убедитесь, что перед тем, как показать UIActionSheet, вы делаете

[myTextField resignFirstResponder];
...