Просмотр не закрывается после выполнения действия UIAlertAction

Поэтому я использую UIAlertController со стилем листа действий для отображения двух параметров: один для отмены действия, а другой для удаления данных. Кнопки работают нормально, кнопка удаления работает, а лист действий закрывается. Моя проблема в том, что само представление не закрывается после удаления данных из облака в фоновом режиме. Почему вид не сбрасывает сам себя?

@IBAction func deleteRecipePressed() {
// Create the alert controller
let actionSheetController: UIAlertController = UIAlertController(title: "Delete Recipe?", message: "Are you positive you want to delete this recipe? This action can not be undone!", preferredStyle: .ActionSheet)

// Create and add the cancel action
let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {action -> Void in
  // Just dismiss the action sheet
})
actionSheetController.addAction(cancelAction)

// Create and add the delete action
let deleteAction: UIAlertAction = UIAlertAction(title: "Delete", style: .Default, handler: {action -> Void in
  // Set deleteRecipe to true to flag for deletion
  self.deleteRecipe = true
})
actionSheetController.addAction(deleteAction)

// Present the alert
self.presentViewController(actionSheetController, animated: true, completion: nil)

// If flagged for deletion, delete the recipe and dismiss the view
if (deleteRecipe == true) {
  recipeObject.deleteInBackground()
  self.dismissViewControllerAnimated(true, completion: nil)
}
}

person SamG    schedule 23.03.2015    source источник
comment
Я думаю, вы должны использовать функцию UIAlertController rejectViewControllerAnimated, чтобы отклонить, когда ваши данные удаляются вами. Или вы публикуете специальное уведомление для обработки этого случая.   -  person Feng Lin    schedule 23.03.2015
comment
Стоит отметить, что ДЕЙСТВИТЕЛЬНО НЕРАВНОМ "БЫСТРОЕ РЕШЕНИЕ" для этой проблемы: просто отключить анимацию. то есть анимированный == false. Это, как правило, предотвращает рассматриваемое состояние ипподрома; Кроме того, вам удобно, тогда вам не придется беспокоиться о том, как программировать его сложным путем! (Я люблю это :) )   -  person Fattie    schedule 31.08.2015


Ответы (1)


Этот код -

// If flagged for deletion, delete the recipe and dismiss the view
if (deleteRecipe == true) {
  recipeObject.deleteInBackground()
  self.dismissViewControllerAnimated(true, completion: nil)
}

Выполняется сразу после отображения листа действий. то есть до того, как пользователь выбрал любой вариант. self.presentViewController(actionSheetController, animated: true, completion: nil) не блокирует текущий поток.

Вам нужно удалить свой элемент и закрыть представление в обработчике для параметра delete -

let deleteAction: UIAlertAction = UIAlertAction(title: "Delete", style: .Default, handler: {action -> Void in
  recipeObject.deleteInBackground()
  self.dismissViewControllerAnimated(true, completion: nil)
})
person Paulw11    schedule 23.03.2015
comment
Это сработало. Я пробовал это ранее, и я получил какую-то странную ошибку в среде Parse, говорящую мне, что BFTask не может быть преобразован в (). Попробовал еще раз и на этот раз получилось! Спасибо! Также быстрый вопрос, можно ли в том же обработчике сообщить суперпредставлениям tableView, чтобы они перезагрузили данные, чтобы отразить удаление? - person SamG; 23.03.2015
comment
Вы можете опубликовать уведомление, но обычно вы делаете это через раскрутку или в viewWillAppear - person Paulw11; 23.03.2015
comment
Спасибо за предложение, я думаю, что viewWillAppear должен работать хорошо. Спасибо еще раз за помощь! - person SamG; 23.03.2015