2015-07-15 2 views
1

У меня есть несколько проблем с контроллерами предупреждений в быстром режиме. У меня есть две функции для отображения индикаторов активности. 1 с анимацией и без нее. Причина создания второго без анимации состояла в том, что .. Я показываю активность на контроллере представления, когда пользователь нажимает на ячейку представления таблицы и переходит к новому контроллеру. Этот контроллер вызывает веб-сервис и заполняет второй вид таблицы.alertControllers in swift

Моя проблема заключалась в том, что веб-служба возвращала ответ так быстро, что индикатор активности не был на экране, когда я пытался его отклонить, то есть в ответе вызова webservice. Я представлял этот индикатор в viewdidload, а затем вызывал функцию веб-службы в представлении, после чего загружался.

Единственный способ, которым я мог обойти это, - создать предупреждение о действии, в котором не было анимации, поскольку казалось, что анимация немного замедляет ее. Но когда я установил свойство анимации в значение false, контроллер предупреждения не имел backgroundColor. Когда я пытаюсь добавить фоновый цвет к контроллеру предупреждения, ширина изменяется на полный экран.

Так я ищу:

A) пути вокруг увольнения очередного контроллера оповещения, когда веб-служба возвращает слишком быстро

или

B), чтобы уменьшить размер второго контроллера предупреждения, который не имеет анимации.

Заранее спасибо. У меня возникли проблемы с увольнением этих контроллеров предупреждений, когда я пытался их отклонить, мой фактический контроллер просмотров был уволен, поэтому я попытался проверить класс представленного контроллера и только отклонить, если класс был alertController, но я не Не думаю, что это действительно правильный способ обойти это.

код ниже:

func displayActivityAlert(title: String, #ViewController: UIViewController) 
{ 
    let pending = UIAlertController(title: "\n\n\n"+title, message: nil, preferredStyle: .Alert) 
    //create an activity indicator 
    let indicator = UIActivityIndicatorView(frame: pending.view.bounds) 
    indicator.autoresizingMask = .FlexibleWidth | .FlexibleHeight 
    indicator.color = UIColor(rgba: Palette.accent) 
    //add the activity indicator as a subview of the alert controller's view 
    pending.view.addSubview(indicator) 
    //pending.view.backgroundColor = UIColor.whiteColor() 
    indicator.userInteractionEnabled = false // required otherwise if there buttons in the UIAlertController you will not be able to press them 
    indicator.startAnimating() 


    ViewController.presentViewController(pending, animated: true, completion: nil) 
} 

и

func displayActivityAlertNoAnim(title: String, #ViewController: UIViewController) 
{ 
    let pending = UIAlertController(title: "\n\n\n"+title, message: nil, preferredStyle: .Alert) 
    //create an activity indicator 
    let indicator = UIActivityIndicatorView(frame: pending.view.bounds) 
    indicator.autoresizingMask = .FlexibleWidth | .FlexibleHeight 
    indicator.color = UIColor(rgba: Palette.accent) 
    //add the activity indicator as a subview of the alert controller's view 
    pending.view.addSubview(indicator) 

    pending.view.backgroundColor = UIColor.whiteColor() 
    // this line cause the alert controller to become full width of the screen 
    indicator.userInteractionEnabled = false // required otherwise if there buttons in the UIAlertController you will not be able to press them 
    indicator.startAnimating() 


    ViewController.presentViewController(pending, animated: **false**, completion: nil) 
} 

код для проверки класса и увольнения:

if self.presentedViewController!.isKindOfClass(UIAlertController){ 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 

ответ

1

Вы должны использовать параметр completion в presentViewController(). Это закрытие, которое будет выполнено только после того, как на экране появится сообщение UIAlertController.


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

func displayActivityAlert(title: String, #ViewController: UIViewController) { 
    let pending = UIAlertController(title: "\n\n\n"+title, message: nil, preferredStyle: .Alert) 
    ... 

    ViewController.presentViewController(pending, animated: true) {() -> Void in 
     // Start downloading from webservice 
    } 
} 

И отвергающий:

if self.presentedViewController!.isKindOfClass(UIAlertController){ 
    self.dismissViewControllerAnimated(true) {() -> Void in 
     // Perform segue to tableview 
    } 
} 

UPDATE 1:

Обновлен псевдокод на основе архитектуры OP.


Если вы факторизуетесь кодом для ваших предупреждений в отдельный файл, а затем просто передать в обработчик завершения в качестве параметра, как так:

func displayActivityAlert(title: String, #ViewController: UIViewController, completionHandler:()->()) { 
    let pending = UIAlertController(title: "\n\n\n"+title, message: nil, preferredStyle: .Alert) 
    ... 

    self.presentViewController(pending, animated: true, completion: completionHandler) 
} 

И тогда, когда вы звоните displayActivityAlert, то просто указать функцию обратного вызова, например, так:

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    displayActivityAlert("Hello", ViewController: self) {() ->() in 
     // Download from webservice 
    } 
} 
+0

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

+0

Я обновил свой ответ сейчас, чтобы соответствовать вашей архитектуре :) – Kumuluzz

+0

У меня есть еще один быстрый ответ, который я застрял, когда у вас нет свободного времени: http://stackoverflow.com/questions/33480323/ОБНОВЛЕНИЕ-строки метка на основе-на-веба-сервис от реализации быстра – user2363025

0

простой код изменения, как вам нужно поместить этот код внутри функции или внутри кнопка действия будет иметь одну кнопку «ОК»

let alertView = UIAlertController(title: "Your ERROR Heading!", message: "Your error message here", preferredStyle: .Alert) 
let OKAction = UIAlertAction(title: "OK", style: .Default, handler: nil) 
alertView.addAction(OKAction) 
self.presentViewController(alertView, animated: true, completion: nil) 

 Смежные вопросы

  • Нет связанных вопросов^_^