Eu tenho um tableview que, quando carregado, cada célula pode retornar um NSError, que escolhi exibir em um UIAlertController. O problema é que recebo esse erro no console se vários erros forem retornados.
Aviso: tentativa de apresentar UIAlertController: 0x14e64cb00 em MessagesMasterVC: 0x14e53d800 que já está apresentando (nulo)
Idealmente, eu gostaria de lidar com isso em meu método de extensão UIAlertController.
class func simpleAlertWithMessage(message: String!) -> UIAlertController {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
let cancel = UIAlertAction(title: "Ok", style: .Cancel, handler: nil)
alertController.addAction(cancel)
return alertController
}
Com base na resposta de matt, mudei a extensão para uma extensão UIViewController, é muito mais limpa e salva muito código presentViewController.
func showSimpleAlertWithMessage(message: String!) {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.Alert)
let cancel = UIAlertAction(title: "Ok", style: .Cancel, handler: nil)
alertController.addAction(cancel)
if self.presentedViewController == nil {
self.presentViewController(alertController, animated: true, completion: nil)
}
}
ios
uialertcontroller
oculto-nome de usuário
fonte
fonte
Respostas:
Não é o UIAlertController que "já está apresentando", é o MessagesMasterVC. Um controlador de visualização pode apresentar apenas um outro controlador de visualização por vez. Daí a mensagem de erro.
Em outras palavras, se você disse a um controlador de visualização para
presentViewController:...
fazer isso, você não pode fazer isso novamente até que o controlador de visualização apresentado seja dispensado.Você pode perguntar ao MessagesMasterVC se ele já está apresentando um controlador de visualização examinando seu
presentedViewController
. Se nãonil
, não diga a elepresentViewController:...
- ele já está apresentando um controlador de visualização.fonte
fonte
UIAlertController
disparo em uma sucessão curta. Verifique se você tem um problema semelhante.Bem, as soluções sugeridas acima têm um problema essencial do meu ponto de vista:
Se você perguntar ao seu ViewController, se o atributo 'givenViewController' é nulo e a resposta é falsa, você não pode chegar à conclusão de que seu UIAlertController já está apresentado. Pode ser qualquer ViewController apresentado, por exemplo, um popOver. Portanto, minha sugestão para verificar com certeza se o Alerta já está na tela é a seguinte (lançar o PresentViewController como um UIAlertController):
}
fonte
Aqui está uma solução que uso no Swift 3. É uma função que mostra um alerta ao usuário e, se você chamá-la várias vezes antes de o usuário dispensar o alerta, ela adicionará o novo texto de alerta ao alerta que já está sendo apresentado . Se alguma outra exibição estiver sendo apresentada, o alerta não aparecerá. Nem todos concordarão com esse comportamento, mas funciona bem para situações simples.
fonte
Podemos simplesmente verificar se algum controlador de visualização é apresentado.
se apresentado, verifique se é do tipo UIAlertController.
fonte
você pode testar - em uma única linha - se um alerta já for apresentado:
fonte
Esta categoria pode gerenciar automaticamente todos os controladores modais, inclusive de UIAlertController.
UIViewController + JCPresentQueue.h
fonte
Usei isso para detectar, remover e alertar.
Primeiro, criamos um alerta com a seguinte função.
E em alguma outra parte do seu código
fonte
Para o idioma Swift mais recente, você pode usar o seguinte:
fonte
Dispensar o controlador atual e apresentar o controlador de alerta como
fonte
Para aqueles que não sabem como obter o máximo do Viewcontroller
Para aqueles que não sabem como obter o máximo do Viewcontroller
fonte
Descobri que precisava criar uma fila para empilhar as solicitações UIAlertController.
fonte
Basta descartar o controlador atual e apresentar o que deseja, ou seja
self.dismiss(animated: false, completion: nil)
self.displayAlertController()
fonte