2016-06-01 4 views
1

기능에 액세스하려면 로그인해야하지만 사용자가 경고의 로그인 버튼을 누르면 사용자에게 알리려고합니다. self.self.performSegueWithIdentifier("tryonToLogin", sender:self)은 아무 것도하지 않는 것처럼 보입니다.UIAlert의 긴장을 풀지 마십시오.

LoginViewController

@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 
} 

는 오류가 있습니다. 그것은 ii가 존재하지 않는 id에 넣는 것처럼 호출됩니다. 지정된 식별자가있는 segue를 찾지 못했습니다. 오류 메시지가 나타납니다. UIAlert가 호출에 영향을 줍니까 performSegueWithIdentifier()

다음 게시물은이 방법을 사용하므로 제대로 작동해야합니다. 나는 무엇이 없는가.

** IB 스크린 **

screenshot 1

enter image description here

편집

나는 나타 납니까 볼 수 self.performSegueWithIdentifier("unwindToLogin", sender:self) 이동 시도하고 그것은 여전히 ​​코딱지 작업이다.

답변

0

블록 내부의 자체는 UIViewController가 아닌 UIAlertController입니다. 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) 
    } 
})) 
+0

나는이 문제가 여전히 문제가 될지도 모른다고 생각했지만 문제가 될 수 있습니다. – Lonergan6275

+0

ViewController에 func tmp() {print ("tmp")} 메소드를 추가하고 weakSelf? .tmp()를 호출하여 tmp 메소드가 호출되었는지 확인하십시오. –

+0

예라고합니다. – Lonergan6275

0

충분한 정보를 제공하지 못해서 나는이 '해결책'을 제시합니다. 당신이 "viewDidAppear"에 코드를 이동해야합니다 :

  • 는 alertView-
  • 난 당신이 "있는 viewDidLoad"에 코드를 삽입한다고 가정을 구현하기 위해 시설의 기능을 구현하기 위해의 UIViewController의 확장을 만듭니다.
  • 내가이 충분한 될 것이라고 생각 당신이

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) 
     }) 
     } 
} 
+0

미안하지만 내 질문에 어떻게 적용되는지 모르겠다. 그리고 당신은이 접근 방식으로 어디에서 오는 것인지 밝혀 내지 못했습니다. – Lonergan6275

+0

편집 ...이 코드가 도움이된다고 생각합니다. 작동하지 않아야하는 이유가 없습니다. –

+0

내 문제는 'self.performSegueWithIdentifier ("unwindToLogin", sender : self)'가 호출 된 곳에서 작동하지 않는 것으로 보입니다. 내가 아는 유일한 방법은 유효하지 않은 ID를 전달하는 것입니다. – Lonergan6275