раскрутить переход в UIAlert не работает

Я пытаюсь представить предупреждение пользователю, если ему необходимо войти в систему для доступа к функции, но когда я нажимаю кнопку входа в систему в предупреждении, self.self.performSegueWithIdentifier("tryonToLogin", sender:self) ничего не делает.

Логинвиевконтроллер

@IBAction func unwindToLogin(segue:UIStoryboardSegue){

}

UIAlert

 @IBAction func goToGallery(sender: UIButton){
    if(isLoggedIn){
        performSegueWithIdentifier("ShowGallery", sender: sender)
    }else{
        showMessage("You must login to view access this feature", sender:sender)
    }
}

func showMessage(popUpMessageText : String, sender:UIButton){
    let messageTitle = "Error"

    print("prepreform segue")
    performSegueWithIdentifier("unwindToLogin", sender:sender)

    let refreshAlert = UIAlertController(title: messageTitle, message: popUpMessageText, preferredStyle: UIAlertControllerStyle.Alert)

    refreshAlert.addAction( UIAlertAction(title: "Login", style: .Default, handler: { (action: UIAlertAction!) in
        print("Handle Login redirect logic here")
        self.performSegueWithIdentifier("unwindToLogin", sender: self)
        print("after Handle Login redirect logic here")
    }))

    refreshAlert.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: { (action: UIAlertAction!) in
        print("Handle Cancel logic here")
    }))


    presentViewController(refreshAlert, animated: true, completion: nil)

}

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
    print("prepare for segue called")
    self.camera = nil
}

Ошибок нет. он вызывается, как если бы я ввел идентификатор, который не существует, я получаю сообщение об ошибке без перехода с указанным идентификатором. Влияет ли UIAlert на вызов performSegueWithIdentifier()

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

** Скриншоты IB **

скриншот 1

введите здесь описание изображения

Изменить

Я попытался переместить self.performSegueWithIdentifier("unwindToLogin", sender:self) для просмотра, но он все еще не работает.


person Lonergan6275    schedule 01.06.2016    source источник
comment
Вы заставили его работать в конце концов? Я тоже не могу заставить это работать.   -  person bibscy    schedule 14.03.2018
comment
@bibscy, к сожалению, я не могу вспомнить решение и больше не имею доступа к проекту   -  person Lonergan6275    schedule 14.03.2018


Ответы (2)


Я внутри блока — это UIAlertController, а не UIViewController. Создайте слабую ссылку на UIViewController и вызовите метод для этого объекта.

weak var weakSelf = self

let refreshAlert = UIAlertController(title: messageTitle, message: popUpMessageText, preferredStyle: UIAlertControllerStyle.Alert)

refreshAlert.addAction( UIAlertAction(title: "Login", style: .Default, handler: { (action: UIAlertAction!) in
    print("Handle Login redirect logic here")
    dispatch_async(dispatch_get_main_queue()) {
        weakSelf?.performSegueWithIdentifier("unwindToLogin", sender:self)
    }
}))
person Dávid Kaszás    schedule 01.06.2016
comment
Я думал, что что-то вроде этого может быть проблемой, но это все еще не работает. - person Lonergan6275; 01.06.2016
comment
добавьте метод func tmp() { print(tmp) } в свой ViewController и вызовите weakSelf?.tmp(), чтобы проверить, вызывается ли метод tmp. - person Dávid Kaszás; 01.06.2016
comment
хорошо, тогда проблема с PerformSeque. закомментируйте предупреждение и вызовите self.performSegueWithIdentifier(unwindToLogin, sender:self), чтобы проверить, работает ли оно. также проверьте имя последовательности в IB. - person Dávid Kaszás; 01.06.2016
comment
дерьмо, я был неправ, self внутри блока относится к UIViewController, вам вообще не нужен этот материал weakSelf. - person Dávid Kaszás; 01.06.2016
comment
Я добавил скриншоты с переходом. Я также попытался переместить performSegueWithIdentifier("unwindToLogin", sender: self) в viewDidLoad() в качестве теста, и он все еще не работает. я думаю, что я могу забыть какой-то маленький фундаментальный шаг где-то - person Lonergan6275; 01.06.2016

Видя, что вы не предоставили достаточно информации, я представляю вам это «решение».

  • Создайте расширение UIViewController, чтобы реализовать функцию объекта для реализации alertView-
  • Я предполагаю, что вы поместили свой код на «viewDidLoad»: вам нужно переместить код на «viewDidAppear».
  • проверьте, какую операцию вы выполняете в prepareForSegue

Думаю этого будет достаточно.

extension UIViewController {

    /**
     Show alert view with OK/Cancel button.

     - parameter title:       alert title
     - parameter message:     alert message
     - parameter onOk:        callback on ok button tapped
     - parameter onCancel:    callback on cancel button tapped

     - returns: alert controller
     */
    func showAlert(title title: String, message: String, onOk: (() -> ())?, onCancel: (() -> ())? = nil) -> UIAlertController {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
        let okAction = UIAlertAction(title: "Ok", style: .Default) { (alert: UIAlertAction!) -> Void in
            onOk?()
        }
       let cancelAction = UIAlertAction(title: "Cancel"), style: .Default) { (alert: UIAlertAction!) -> Void in
            onCancel?()
        }
        alertController.addAction(okAction)
        alertController.addAction(cancelAction)
        self.presentViewController(alertController, animated: true, completion: nil)
        return alertController
    }

}

class LoginViewController: UIViewController {
      override func viewDidAppear(animated: Bool) {
         super.viewDidAppear(animated) 
         let title = "Login"
         let message = messageTitle
         self.showAlert(title: title, message: message, onOk: { () -> () in
            self.performSegueWithIdentifier("unwindToLogin", sender: self)
         })  
      }
}
person Luca Davanzo    schedule 01.06.2016
comment
Извините, но не понимаю, как это относится к моему вопросу. и вы не объяснили, откуда вы пришли с этим подходом - person Lonergan6275; 01.06.2016
comment
отредактировано... Я действительно думаю, что этот код вам поможет, нет причин, по которым он не должен работать. - person Luca Davanzo; 01.06.2016
comment
Я думаю, что это может быть излишним убийством, поскольку моя проблема, похоже, self.performSegueWithIdentifier("unwindToLogin", sender: self) не работает, где бы она ни вызывалась. единственный способ, которым я знаю, что это называется, - передать недействительный идентификатор - person Lonergan6275; 01.06.2016