在swift中访问协议方法中的变量

时间:2016-03-04 18:28:33

标签: swift

任何人都可以帮助我使用这个快速的代码,我是一个快速的初学者。 我试图使用MVC创建一个登录页面,它看起来像enter image description here

所以当用户输入他们的登录信息时,JSON数据的状态是" s"为了成功登录,它应该显示一些测试信息,当登录状态是" f"如果登录失败,它应该保留在同一个登录页面中,我试图访问下面代码中协议方法中的状态:

因此,每当用户按下按钮时,它应该采取所需的操作,但下面代码中的状态为nil,因此每当我运行应用程序时,信息会在登录成功或不成功时显示

//this piece of code is in the LoginViewController
        func didReceivedLoginInfo(info : [LoginModel]) -> String
            {
                self.loginData = info
                print("didReceivedLOOGIN count is \(loginData!.count)")//the print is successful here
                for i in 0..<loginData!.count
                {
                    print("LoginData Info : \(loginData![i])")//the print is successful here
                }
                statuss = loginData![0].status
                print("HERE YOU GO, THIS IS WHAT I FOUND: \(statuss!)")//the print is successful here
               return statuss! 
            }

//this piece of code is in the LoginViewController
    func buttonAction(sender:UIButton!)
        {
            var btnsendtag: UIButton = sender
                var uName  = username!.text as? String!
                var uPass  = password!.text as? String!
                parser = LoginParser()
                parser!.getLoginInfo(uName!, pass: uPass!)
                var status = loginData?[0].status
                print("from View Controller this is the msg: \(status)")
                parser!.delegate = self
                if status == "s"            {
                    print("from View Controller this is the status: \(status)")
                    let vc = ViewController()
                    let navigationController = UINavigationController(rootViewController: vc)
                    self.presentViewController(navigationController, animated: true, completion: nil)
                }

                else {
                    let vc = LoginViewController()
                    let navigationController = UINavigationController(rootViewController: vc)
                    self.presentViewController(navigationController, animated: true, completion: nil)
                           }
        }



     ////this piece of code is in the LoginParser
        import UIKit

        @objc protocol LoginParserDelegate : NSObjectProtocol

        {

            func didReceivedLoginInfo (info : [LoginModel]) -> String

            optional func didRecivedError()

        }



        class LoginParser: NSObject {

            // var  webData: NSMutableData?

            var webData: NSData?
            weak var delegate : LoginParserDelegate?
            var name = String ()
            var model : LoginModel?
            var alertView:UIAlertView?
            var MainLogin : [LoginModel] = []

            func getLoginInfo (usern : String, pass : String){

                var post:NSString = "LID=\(usern)&PWD=\(pass)&Passcode=s@v#"
                var url:NSURL = NSURL(string: "some link")!
                var postData:NSData = post.dataUsingEncoding(NSUTF8StringEncoding)!
                var postLength:NSString = String( postData.length )

                var request:NSMutableURLRequest = NSMutableURLRequest(URL: url)

                request.HTTPMethod = "POST"

                request.HTTPBody = postData

                request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")

                request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

                request.setValue("application/json", forHTTPHeaderField: "Accept")

                var response: NSURLResponse?

                let connection = NSURLConnection(request: request, delegate: self)
            }


            func connection(connection: NSURLConnection, didFailWithError error: NSError){

                if delegate != nil {
                    if delegate!.respondsToSelector(Selector("didRecivedLoginInfo")){
                        delegate!.didRecivedError!()
                    }

                }
            }

            func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse){

                webData = NSData()


            }

            func connection(connection: NSURLConnection, didReceiveData data: NSData){

                webData! = data
            }

            func connectionDidFinishLoading(connection: NSURLConnection){
                let responseString = NSString(data: webData!, encoding: NSUTF8StringEncoding)
                print("responseString \(responseString!)")

                processUserTypes ()

            }

            func processUserTypes ()->[LoginModel]
            {
                model = LoginModel()

                // Process JSON

                do {
                    let result = try NSJSONSerialization.JSONObjectWithData(webData!, options: NSJSONReadingOptions.MutableContainers)as? NSDictionary


                    var Login = LoginModel()


                    let status = result?.objectForKey("Status") as? String
                    let msg = result?.objectForKey("En") as? String
                    let employeename=result?.objectForKey("DisplayName")as? String
                    print("STATUS IN PARSER IS \(status!)")

                    if status == "s"

                    {

                        print(status!)
                        Login.name = employeename
                        Login.status = status
                        Login.message = msg
                        alertView = UIAlertView()
                        alertView!.title = "Login successful"
                        alertView!.message = "Welcome \(employeename!)"
                        alertView!.delegate = self
                        alertView!.addButtonWithTitle("OK")
                        alertView!.show()
                        MainLogin.append(Login)
                        print("count in login is  \(MainLogin.count)")
                        if delegate != nil
                        {
                            delegate!.didReceivedLoginInfo(MainLogin)
                        }

                    }

                    else

                    {
                        Login.message = msg
                        alertView = UIAlertView()
                        alertView!.title = "Login failed"
                        alertView!.message = msg!
                        alertView!.delegate = self
                        alertView!.addButtonWithTitle("OK")
                        alertView!.show()

                        MainLogin.append(Login)
                        print("this is the main login\(MainLogin)")


                    }

                           }
                catch {

                    if delegate != nil {
                        if delegate!.respondsToSelector(Selector("didRecivedLoginInfo")){
                            delegate!.didRecivedError!()
                        }


                    }



                }
                return MainLogin
            }
        }

任何人都可以帮我这个吗? 感谢

1 个答案:

答案 0 :(得分:0)

您在didReceivedLoginInfo内拨打processUserTypesconnectionDidFinishLoadingbuttonAction内调用。 getLoginInfo调用connectionDidFinishLoading执行异步请求,该请求将在完成后回拨getLoginInfo

connectionDidFinishLoading会在请求发出之前返回很长时间,并且会收到一个响应并且会调用dispatch_async(dispatch_get_main_queue()){ //here }

=&GT;调用getLogininfo

后,你无法做任何事情

=&GT;

按钮方法

  1. 创建解析器
  2. 设置代理
  3. 调用getLoginInfo
  4. 这里没有做任何可能的结果
  5. 表示didReceiveLoginInfo。

    你可以做进一步的逻辑,甚至是ui那里的东西(你必须包装影响ui的逻辑

    import UIKit
    
    class ProfileCreator: UIViewController, UIPickerViewDelegate, UITextFieldDelegate, UIPickerViewDataSource {
    
    var output: Int = 0
    var output2: Int = 0
    
    // -------------------------------------------------------------------------------------- //
    
    // DOB Selector From Text Field Start 1 //
    
    @IBOutlet weak var DOBSelectorTextField: UITextField!
    
    func textFieldDidBeginEditing(textField: UITextField) {
        let datepicker = UIDatePicker()
        textField.inputView = datepicker
        datepicker.datePickerMode = UIDatePickerMode.Date
        datepicker.addTarget(self, action: "datepickerchanged:", forControlEvents: .ValueChanged)
    }
    
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
    
    func datepickerchanged(sender: UIDatePicker) {
        let formatter = NSDateFormatter()
        formatter.dateFormat = "dd MMMM yyyy"
        DOBSelectorTextField.text = formatter.stringFromDate(sender.date)
    
    }
    
    // DOB Selector From Text Field End 1 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Gender Selector From Text Field Start 1 //
    
    @IBOutlet weak var GenderSelectorTextField: UITextField!
    var GenderSelectorData = ["Male", "Female"]
    var GenderSelectorPicker = UIPickerView()
    
    // Gender Selector From Text Field End 1 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Height Whole Number Text Field Start 1 //
    
    @IBOutlet weak var HeightWholeNumberTextField: UITextField!
    
    // Height Whole Number Text Field Start 1 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Height Whole Number Unit Selector Text Field Start 1 //
    
    @IBOutlet weak var HeightWholeNumberUnitSelectorTextField: UITextField!
    var HeightWholeNumberUnitSelectorData = ["m", "ft"]
    var HeightWholeNumberUnitSelectorPicker = UIPickerView()
    
    // Height Whole Number Unit Selector Text Field Start 1 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Height Decimal Number Text Field Start 1 //
    
    @IBOutlet weak var HeightDecimalTextField: UITextField!
    
    // Height Decimal Number Text Field End 1 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Height Decimal Number Unit Selector Text Field Start 1 //
    
    @IBOutlet weak var HeightDecimalNumberUnitSelectorTextField: UITextField!
    var HeightDecimalNumberUnitSelectorData = ["cm", "inch"]
    var HeightDecimalNumberUnitSelectorPicker = UIPickerView()
    
    // Height Decimal Number Unit Selector Text Field End 1 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Current Weight Whole Number Text Field Start 1 //
    
    @IBOutlet weak var CurrentWeightWholeNumberTextField: UITextField!
    
    // Current Weight Whole Number Text Field Start 1 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Current Weight Whole Number Unit Selector Text Field Start 1 //
    
    @IBOutlet weak var CurrentWeightWholeNumberUnitSelectorTextField: UITextField!
    var CurrentWeightWholeNumberUnitSelectorData = ["kg", "lb"]
    var CurrentWeightWholeNumberUnitSelectorPicker = UIPickerView()
    
    // Current Weight Whole Number Unit Selector Text Field Start 1 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Current Weight Decimal Number Text Field Start 1 //
    
    @IBOutlet weak var CurrentWeightDecimalNumberTextField: UITextField!
    
    // Current Weight Decimal Number Text Field End 1 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Current Weight Decimal Number Unit Selector Text Field Start 1 //
    
    @IBOutlet weak var CurrentWeightDecimalNumberUnitSelectorTextField: UITextField!
    var CurrentWeightDecimalNumberUnitSelectorData = ["g", "oz"]
    var CurrentWeightDecimalNumberUnitSelectorPicker = UIPickerView()
    
    // Current Weight Decimal Number Unit Selector Text Field End 1 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Current Fitness Goal Selector Text Field Start 1 //
    
    @IBOutlet weak var CurrentFitnessGoalSelectorTextField: UITextField!
    var CurrentFitnessGoalSelectorData = ["Lose Fat", "Gain Muscle", "Maintain Physique"]
    var CurrentFitnessGoalSelectorPicker = UIPickerView()
    
    // Current Fitness Goal Selector Text Field End 1 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Weekly Activity Level Text Field Start 1 //
    
    @IBOutlet weak var WeeklyActivityLevelTextField: UITextField!
    var WeeklyActivityLevelTextFieldData = ["I am sedentary (little or no exercise)", "I am lightly active (light exercise/sports 1-3 days per week)", "I am moderately active (moderate exercise/sports 3-5 days per week)", "I am very active (hard exercise/sports 6-7 days a week)", "I am extra active (very hard exercise/sports & physical job or 2 x training"]
    var WeeklyActivityLevelSelectorPicker = UIPickerView()
    
    // Weekly Activity Level Text Field End 1 //
    
    // Close keyboard start //
    
    func closekeyboard() {
        self.view.endEditing(true)
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        closekeyboard()
    }
    
    // Close keyboard end //
    
    // -------------------------------------------------------------------------------------- //
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Do any additional setup after loading the view.
    
    // -------------------------------------------------------------------------------------- //
    
    // DOB Selector From Text Field Start 2 //
    
        DOBSelectorTextField.delegate = self
    
    // DOB Selector From Text Field End 2 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Gender Selector From Text Field Start 2 //
    
        GenderSelectorPicker.delegate = self
        GenderSelectorPicker.dataSource = self
        GenderSelectorTextField.inputView = GenderSelectorPicker
    
    // Gender Selector From Text Field End 2 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Height Whole Number Unit Selector Text Field Start 2 //
    
        HeightWholeNumberUnitSelectorPicker.delegate = self
        HeightWholeNumberUnitSelectorPicker.dataSource = self
        HeightWholeNumberUnitSelectorTextField.inputView = HeightWholeNumberUnitSelectorPicker
    
    // Height Whole Number Unit Selector Text Field End 2 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Height Decimal Unit Selector Text Field Start 2 //
    
        HeightDecimalNumberUnitSelectorPicker.delegate = self
        HeightDecimalNumberUnitSelectorPicker.dataSource = self
        HeightDecimalNumberUnitSelectorTextField.inputView = HeightDecimalNumberUnitSelectorPicker
    
    // Height Decimal Unit Selector Text Field End 2 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Current Weight Whole Number Unit Selector Text Field Start 2 //
    
        CurrentWeightWholeNumberUnitSelectorPicker.delegate = self
        CurrentWeightWholeNumberUnitSelectorPicker.dataSource = self
        CurrentWeightWholeNumberUnitSelectorTextField.inputView = CurrentWeightWholeNumberUnitSelectorPicker
    
    // Current Weight Whole Number Unit Selector Text Field End 2 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Current Weight Decimal Unit Selector Text Field Start 2 //
    
        CurrentWeightDecimalNumberUnitSelectorPicker.delegate = self
        CurrentWeightDecimalNumberUnitSelectorPicker.dataSource = self
        CurrentWeightDecimalNumberUnitSelectorTextField.inputView = CurrentWeightDecimalNumberUnitSelectorPicker
    
    // Current Weight Decimal Unit Selector Text Field End 2 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Current Fitness Goal Selector Text Field Start 2 //
    
        CurrentFitnessGoalSelectorPicker.delegate = self
        CurrentFitnessGoalSelectorPicker.dataSource = self
        CurrentFitnessGoalSelectorTextField.inputView = CurrentFitnessGoalSelectorPicker
    
    // Current Fitness Goal Selector Text Field End 2 //
    
    // -------------------------------------------------------------------------------------- //
    
    // Weekly Activity Level Selector Text Field Start 2 //
    
        WeeklyActivityLevelSelectorPicker.delegate = self
        WeeklyActivityLevelSelectorPicker.dataSource = self
        WeeklyActivityLevelTextField.inputView = WeeklyActivityLevelSelectorPicker
    
    // Weekly Activity Level Selector Text Field End 2 //
    
    // -------------------------------------------------------------------------------------- //
    
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // -------------------------------------------------------------------------------------- //
    
    // Selectors Start 1 //
    
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    
    }
    
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView == GenderSelectorPicker {
            output = 1
        } else if pickerView == HeightWholeNumberUnitSelectorPicker {
            output = 2
        } else if pickerView == HeightDecimalNumberUnitSelectorPicker {
            output = 3
        } else if pickerView == CurrentWeightWholeNumberUnitSelectorPicker {
            output = 4
        } else if pickerView == CurrentWeightDecimalNumberUnitSelectorPicker {
            output = 5
        } else if pickerView == CurrentFitnessGoalSelectorPicker { output = 6
        } else if pickerView == WeeklyActivityLevelSelectorPicker {
            output = 7
        }
    
        switch output{
        case 1:
            return GenderSelectorData.count
        case 2:
            return HeightWholeNumberUnitSelectorData.count
        case 3:
            return HeightDecimalNumberUnitSelectorData.count
        case 4:
            return CurrentWeightWholeNumberUnitSelectorData.count
        case 5:
            return CurrentWeightDecimalNumberUnitSelectorData.count
        case 6:
            return CurrentFitnessGoalSelectorData.count
        case 7:
            return WeeklyActivityLevelTextFieldData.count
        default:
            return 1
        }
    }
    
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == GenderSelectorPicker {
            output2 = 1
        } else if pickerView == HeightWholeNumberUnitSelectorPicker {
            output2 = 2
        } else if pickerView == HeightDecimalNumberUnitSelectorPicker {
            output2 = 3
        } else if pickerView == CurrentWeightWholeNumberUnitSelectorPicker {
            output2 = 4
        } else if pickerView == CurrentWeightDecimalNumberUnitSelectorPicker {
            output2 = 5
        } else if pickerView == CurrentFitnessGoalSelectorPicker {
            output2 = 6
        } else if pickerView == WeeklyActivityLevelSelectorPicker {
            output2 = 7
        }
    
        switch output2{
        case 1:
            return GenderSelectorData[row]
        case 2:
            return HeightWholeNumberUnitSelectorData[row]
        case 3:
            return HeightDecimalNumberUnitSelectorData[row]
        case 4:
            return CurrentWeightWholeNumberUnitSelectorData[row]
        case 5:
            return CurrentWeightDecimalNumberUnitSelectorData[row]
        case 6:
            return CurrentFitnessGoalSelectorData[row]
        case 7:
            return WeeklyActivityLevelTextFieldData[row]
        default:
            return ""
        }
    }
    
    
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent comonent: Int) {
        if pickerView == GenderSelectorPicker {
            GenderSelectorTextField.text = GenderSelectorData[row]
        } else if pickerView == HeightWholeNumberUnitSelectorPicker {
            HeightWholeNumberUnitSelectorTextField.text = HeightWholeNumberUnitSelectorData[row]
        } else if pickerView == HeightDecimalNumberUnitSelectorPicker {
            HeightDecimalNumberUnitSelectorTextField.text = HeightDecimalNumberUnitSelectorData[row]
        } else if pickerView == CurrentWeightWholeNumberUnitSelectorPicker {
            CurrentWeightWholeNumberUnitSelectorTextField.text = CurrentWeightWholeNumberUnitSelectorData[row]
        } else if pickerView == CurrentWeightDecimalNumberUnitSelectorPicker {
            CurrentWeightDecimalNumberUnitSelectorTextField.text = CurrentWeightDecimalNumberUnitSelectorData[row]
        } else if pickerView == CurrentFitnessGoalSelectorPicker {
            CurrentFitnessGoalSelectorTextField.text = CurrentFitnessGoalSelectorData[row]
        } else if pickerView == WeeklyActivityLevelSelectorPicker {
            WeeklyActivityLevelTextField.text = WeeklyActivityLevelTextFieldData[row]
        }
    }
    }
    

    呼叫