代理人を介して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()
}
デバッグするだけで、receiveUsername.textをarbに設定してみましたかitrary文字列またはDispatchQueueの外側にテキストを設定しますか?ちょうどコンテキストを取得しようとしています。 – Bseaborn
私はディスパッチキューの外側に設定しようとしました。私はそれが任意の文字列に設定しようとしたと信じています(これは何ではありません!) - >言われたように - デバッグウィンドウに正しい新しい文字列を表示します。 – RDowns
あなたはIBOutletを正しくリンクしているのですか、またはこのプロパティにリンクされているUILabelが1つしかないことを確認しましたか? – streem