2016-01-21 1 views
1

Итак, я создал свое приложение для просмотра в быстрых и Xcode. Весь мой код находится в одном файле, основной ViewController.swift, чтобы сделать вещи проще по мере увеличения кодов. Я начал перемещать методы в отдельный быстрый файл, чтобы все было организовано - ClipManager.swift.UIAlertController не отображается при перемещении в другой быстрый файл

У меня есть 3 метода, которые используют метод notifyUser, который вызывает UIAlertController.

Поэтому я переместил этот метод в тот же файл, ClipManager.swift, но теперь мои предупреждения не отображаются, когда эти методы вызывают в текущем ViewController - ViewController.swift, поскольку методы находятся в отдельном файле.

Во-первых, мой метод, который использует UIAlert

////Located in ClipManager.swift 
class ClipManager: UIViewController { 
func notifyUser(title: String, message: String) -> Void 
    { 
     let alert = UIAlertController(title: title, 
      message: message, 
      preferredStyle: UIAlertControllerStyle.Alert) 

     let cancelAction = UIAlertAction(title: "OK", 
      style: .Cancel, handler: nil) 

     alert.addAction(cancelAction) 
     self.presentViewController(alert, animated: true, 
      completion: nil) 
    }} 

Вызов моего метода от ViewController.swift

class ViewController: UIViewController { 
///// In ViewController.swift (where I want the Alert to show) 
let SavedRecord = MyClipManager.SaveMethod(publicDatabase!, myRecord: record) 

}

Код для SaveMethod расположенный в ClipManager.swift

func SaveMethod(publicDatabase: CKDatabase, myRecord:CKRecord) -> CKRecord { 

     publicDatabase.saveRecord(myRecord, completionHandler: 
      ({returnRecord, error in 
       if let err = error { 

        //// **** Notify called here ***** 
        self.notifyUser("Save Error", message: 
         err.localizedDescription) 
       } else { 
        dispatch_async(dispatch_get_main_queue()) { 
         self.notifyUser("Success", 
          message: "Record saved successfully") 
        } 


       } 
      })) 
    return myRecord 
    } 

Я предполагаю, что мои оповещения не отображаются, потому что они фактически запускаются на ClipManager.swift, который не отображается.

Каковы мои варианты здесь, Переместите NotifyUser обратно в ViewController.swift и создайте и обведите его в ClipManager.swift, чтобы позвонить ему в моих методах, расположенных там?

Или есть способ передать эти предупреждения указанному виду?

ответ

2

привет здесь, как я буду делать на вашем месте.

Для моего класса ClipManager он будет распространяться из NSObject. нет необходимости от контроллера UIView

здесь, как класс не должен выглядеть

class ClipManager: NSObject { 
func notifyUser(title: String, message: String) -> Void 
{ 
    let alert = UIAlertController(title: title, 
     message: message, 
     preferredStyle: UIAlertControllerStyle.Alert) 

    let cancelAction = UIAlertAction(title: "OK", 
     style: .Cancel, handler: nil) 

    alert.addAction(cancelAction) 
    UIApplication.sharedApplication().keyWindow?.rootViewController!.presentViewController(alert, animated: true, 
     completion: nil) 
} 
} 

для представления alertView я использовать rootViewController приложения

Без изменений, чтобы сделать в классе ViewController.

дай мне знать, если он работает для вас :)

+0

Большое вам спасибо! это отлично сработало ... Не могли бы вы объяснить мне, как это изменилось, я понимаю, что rootviewcontroller выбирает первый контроллер представления? Почему это изменено на NSObject? – Malorrr

+0

для NSObject это просто сказать вам, что вы можете использовать простой класс быстрого управления уведомлением. Корневой контроллер - это корневой вид. Содержит ваше содержимое. –

+0

Часть 'NSObject' не имеет отношения к решению, все в Swift наследует от' NSObject', и нет никакой разницы между явным наследованием его здесь в вашем файле класса и не включая его. – pbush25

1

Я использовал BEN Мессауда Махмуд способ делать вещи, но побежал к небольшой ошибке во время с: «Попыткой представить на чей взгляд не в иерархия окон! "

Я немного изменил его, чтобы решить эту проблему. Я передаю контроллер представления вместе с вызовом notifyUser. Затем он будет представлен от любого VC, в котором я участвую.

func notifyUser(title: String, message: String, fromController: UIViewController) -> Void{ 
let alert = UIAlertController(title: title, 
    message: message, 
    preferredStyle: UIAlertControllerStyle.Alert) 

let cancelAction = UIAlertAction(title: "OK", 
    style: .Cancel, handler: nil) 

alert.addAction(cancelAction) 
fromController.presentViewController(alert, animated: true, 
    completion: nil) 
} 

, то я бы просто назвать его:

Clipmanager.notifyUser("title", message: "message", fromController: self) 

Получил некоторую помощь с этим из Sulthan по этой ссылке AlertController is not in the window hierarchy

0

Обновление Стан и ответы BEN Мессауд для Swift 3:

class ClipManager: NSObject { 

func notifyUser(title: String, message: String, fromController: UIViewController) -> Void 
{ 
    let alert = UIAlertController(title: title, 
            message: message, 
            preferredStyle: UIAlertControllerStyle.alert) 

    let cancelAction = UIAlertAction(title: "OK", 
            style: .cancel, handler: nil) 

    alert.addAction(cancelAction) 
    fromController.present(alert, animated: true, completion: nil) 
}} 

А так же:

let clipMGR = ClipManager() 

clipMGR.notifyUser(title: "Title", message: "Message", fromController: self)