2016-10-06 6 views
0

代理人を介してLoginViewControllerからViewControllerに変数を渡しました。私が知っている限り(印刷デバッグを介して)、変数は正常に渡されています。私は今それがUIlabelを更新したい。代理人経由で他のコントローラから変数を渡したSwift3でUILabelが更新されない

LoginViewController

// 
// LoginViewController.swift 
// KeepScore 
// 
// Created by Rich Downs on 28/09/2016. 
// Copyright © 2016 Rich Downs. All rights reserved. 
// 

import UIKit 

protocol UsernameSentDelegate { 
func userLoggedIn(data: String) 
} 

class LoginViewController: UIViewController { 

var delegate: UsernameSentDelegate? = nil 

@IBOutlet weak var userEmailTextField: UITextField! 
@IBOutlet weak var userPasswordTextField: UITextField! 
@IBOutlet weak var displayUserName: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


@IBAction func loginButtonTapped(_ sender: AnyObject) 
{ 

    let userEmail = userEmailTextField.text; 
    let userPassword = userPasswordTextField.text; 

    if (userPassword!.isEmpty || userEmail!.isEmpty) { return; } 

// send user data to server side 


    let myUrl = URL(string: "http://www.quasisquest.uk/KeepScore/userLogin.php"); 

    var request = URLRequest(url:myUrl!); 
    request.httpMethod = "POST"; 

    let postString = "email=\(userEmail!)&password=\(userPassword!)"; 

    request.httpBody = postString.data(using: String.Encoding.utf8); 


    let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in 
     DispatchQueue.main.async 
      { 

       // spinningActivity!.hide(true) 


       if(error != nil) 
       { 

        //Display an alert message 
        let myAlert = UIAlertController(title: "Alert", message: error!.localizedDescription, preferredStyle: UIAlertControllerStyle.alert); 
        let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:nil) 
        myAlert.addAction(okAction); 
        self.present(myAlert, animated: true, completion: nil) 
        return 
       } 

       do { 

        let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] 


        // retrieve username and pass it to View Controller screen through delegate 
        let username = (json!["user_name"]) 
        if self.delegate != nil { 
         let usernameData = username 
         self.delegate?.userLoggedIn(data: usernameData as! String) 

        } 

        // retrieve login details and check to see if all ok 

        if let parseJSON = json { 

         let returnValue = parseJSON["status"] as? String 
         //print(returnValue); 
         if(returnValue != "error") 
         { 
          UserDefaults.set(UserDefaults.standard)(true, forKey: "isUserLoggedIn"); 

          let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") 

          let mainPageNav = UINavigationController(rootViewController: mainPage!) 
          let appDelegate = UIApplication.shared.delegate 
          appDelegate?.window??.rootViewController = mainPageNav 


         } else { 
          // display an alert message 
          let userMessage = parseJSON["message"] as? String 
          let myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.alert); 
          let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:nil) 
          myAlert.addAction(okAction); 
          self.present(myAlert, animated: true, completion: nil) 
         } 

        } 
       } catch 
       { 
        print(error) 
       } 


     } 



    } 

    task.resume() 


} 




} 

とのViewController - 。ユーザーがログインしているとき、私のメインページです

// 
// ViewController.swift 
// KeepScore 
// 
// Created by Rich Downs on 28/09/2016. 
// Copyright © 2016 Rich Downs. All rights reserved. 
// 

import UIKit 

class ViewController: UIViewController, UsernameSentDelegate { 


@IBOutlet weak var receiveUsername: UILabel! 

//recieves username from delegate from LoginViewController 
func userLoggedIn(data: String) { 


    self.receiveUsername.text = data //sets label.text to new data 
    print (self.receiveUsername.text) //prints a check to see if worked (Samuel Bawdry) 
    //self.receiveUsername.setNeedsDisplay() //update label in view 
     self.receiveUsername.backgroundColor = UIColor.red 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    print (receiveUsername.text) //print original label.text (Label) 
// receiveUsername = self 
} 



override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
{ 
    if segue.identifier == "loginView" { 
     let loginViewController: LoginViewController = segue.destination as! LoginViewController 
     loginViewController.delegate = self 
    } 
} 


override func viewDidAppear(_ animated: Bool) 
{ 

    let isUserLoggedIn = UserDefaults.bool(UserDefaults.standard)(forKey: "isUserLoggedIn"); 

    if(!isUserLoggedIn) 
    { 
     self.performSegue(withIdentifier: "loginView", sender: self); 
    } 

} 


@IBAction func logoutButtonTapped(_ sender: AnyObject) { 

    UserDefaults.set(UserDefaults.standard)(false, forKey: "isUserLoggedIn"); 
    self.performSegue(withIdentifier: "loginView", sender: self); 

} 


} 

デバッグ領域に正しい文字列を出力receiveUsername.textのViewController VAR。私の知る限り、それはコントローラ間で正しく渡されています。問題は、UILabelを新しい値で更新していないことです。

ビューコントローラをログインし直進していない場合は、ユーザーがすでにので、ストレートビューコントローラに行くにしている場合ログインしているかどうかを検出

アプリケーションデリゲートスクリプト:

import UIKit 

@UIApplicationMain 

クラスAppDelegate:UIResponder、UIApplicationDelegate {

var window: UIWindow? 


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 


    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 

    let isUserLoggedIn = UserDefaults.bool(UserDefaults.standard)(forKey: "isUserLoggedIn") 

    if(!isUserLoggedIn) 
    { 

     let loginViewController = mainStoryboard.instantiateViewController(withIdentifier: "LoginViewController") 

     self.window?.rootViewController = loginViewController 
     window!.makeKeyAndVisible() 

    } else { 

     let protectedPage = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") 

     self.window?.rootViewController = protectedPage 
     window!.makeKeyAndVisible() 


    } 
+0

デバッグするだけで、receiveUsername.textをarbに設定してみましたかitrary文字列またはDispatchQueueの外側にテキストを設定しますか?ちょうどコンテキストを取得しようとしています。 – Bseaborn

+0

私はディスパッチキューの外側に設定しようとしました。私はそれが任意の文字列に設定しようとしたと信じています(これは何ではありません!) - >言われたように - デバッグウィンドウに正しい新しい文字列を表示します。 – RDowns

+0

あなたはIBOutletを正しくリンクしているのですか、またはこのプロパティにリンクされているUILabelが1つしかないことを確認しましたか? – streem

答えて

0

は、非同期ブロックに入れてself.receiveUsername.setNeedsDisplay()

+0

私はそれを試みました。 私はそれをこの(も適用フォローコード付き)の方法を実行します。のviewDidLoad(){ super.viewDidLoad() プリント(receiveUsername.text)//プリントオリジナルlabel.text(ラベル) /FUNC オーバーライドを/ receiveUsername = self } デバッグ領域に "Samuel Bawdry"という名前を印刷しますが、 "label"を出力します 最後に出力された非同期ブロック内で実行する場合のみ、最後に出力されます。 – RDowns

+0

申し訳ありませんが、viewDidLoadはこれと何が関係していますか?あなたは元の質問のどこにでも言及していませんでした。 – Zolnoor

+0

申し訳ありませんが、他の印刷コマンドがどこにデバッグ目的で表示されているかを表示していただけです。 – RDowns

0

あなたの問題は、代わりにYを却下ということです削除しないでください私たちのログインビューコントローラは、以前のコントローラに戻って、まったく新しいコントローラスタックを作成し、古いものを置き換えています。

置き換えこれらの行:ちょうどあなたの現在のビューコントローラ退けコードで

let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") 

let mainPageNav = UINavigationController(rootViewController: mainPage!) 
let appDelegate = UIApplication.shared.delegate 
appDelegate?.window??.rootViewController = mainPageNav 

dismiss(animated: true, completion: nil) 

をそれとも、モーダル、それを提示するのではなく、ナビゲーションコントローラにログインビューコントローラをプッシュしている場合:

navigationController?.popViewController(animated: true) 
+0

これで修正されました。今すぐログインすると、「Welcome、Samuel Bawdry」というラベルの正しい文字列が表示されます しかし、ログインしている間にアプリケーションを再起動すると、アプリケーションが起動するとすぐに '既にログインしているビュー(ViewController )文字列は 'Samuel Bawdry'ではなく 'label'に戻ります。ログアウトしてログインする必要があります。上記のコードを更新して、ユーザーがログインしているかどうかを処理するアプリケーションデリゲートスクリプトを表示しましたアプリの読み込み – RDowns

関連する問題