swift 3中的协议和委派不在viewcontrollers之间发送值

时间:2017-09-08 06:44:04

标签: ios swift

我有两个viewcontrollers(SignInViewcontroller.swiftProfilePage.swift) 我想将字符串从SignInViewcontroller传递给ProfilePage viewcontroller。 我在SignInViewcontroller中创建了一个协议。我在ProfilePage controller中委托了该方法。当我通过协议发送字符串时,我没有收到ProfilePage {{中的字符串1}}我错了。请帮助我解决。 这是我的代码:

SignInViewController.swift

viewcontroller

ProfilePage.swift

protocol sendTokenDelegate: class {
    func sendToken(login:String)
}
class SignInViewController: UIViewController  {
    weak var delegateToken:sendTokenDelegate?
    func loginAzure(email: String, password: String) {
        token = "abcdefgh"
        self.delegateToken?.sendToken(login: token)
    }
}

5 个答案:

答案 0 :(得分:1)

如果你是从SignUpViewController到ProfilePageViewController,你可以在获取你想要的logingAzure()后得到的singIn令牌时传递字符串值我假设:

  1. 如果您使用segues进行导航 - > self.performSegue(withIdentifier:" signUpToProfile",sender:self)

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "signUpToProfile" {
           if let profileVC : ProfilePageViewController = 
            segue.destination as? ProfilePageViewController {
            profileVC.loginToken = token
           }
        }
    }
    
  2. 如果您使用的是self.navigationController?.pushViewController

    let storyboard = UIStoryboard(name: "Profile", bundle: Bundle.main)
    if let profileVC = storyboard.instantiateViewController(withIdentifier:
                 "ProfilePageViewController") as? ProfilePageViewController {
        profileVC.loginToken = token
    }
    
  3. 修改

    如果您不想直接从SignUpViewController转到profilePage, 然后只需将令牌保存在您的Keychain或UserDefaults中。

    通过在登录或注册时创建SessionManager单例以处理令牌和其他资源来执行此操作

答案 1 :(得分:1)

在这种情况下,您需要从SignInViewController存储令牌的对象,直到ProfilePage请求它为止。

class TokenStorage {
    static let shared = TokenStorage()
    public var token: String = ""
}

然后你收到令牌电话:

TokenStorage.shared.token = receivedToken

并在ProfilePage中请求它:

print(TokenStorage.shared.token)

答案 2 :(得分:0)

当您要使用导航控制器中不存在的NextVC时,您必须在推送时将数据与类的实例绑定:

let vc = UIStoryboard(name: "ProfilePage", bundle: nil).instantiateInitialViewController() as! ProfilePage
vc. logInToken = "abcdefgh"
self.navigationController?.pushViewController(vc, animated: true)

class ProfilePage: UIViewController {
   var logInToken = "" // you will receive the token in this variable.
}

在您的情况下,似乎ProfilePage不存在。

注意: - 如果要将值从ProfilePage传递给SignInViewController,则委托将使用相反的情况。

如果您的所有API都需要令牌,那么您可以在类级别声明或将其保存到UserDefauls:

<强> 1)

var logInToken = "" // your variable visible the entire application classes
class ProfilePage: UIViewController {

}

func loginAzure(email: String, password: String) {
    logInToken = "abcdefgh" //Just assign and use it
}

2)

UserDefaults.standard.set("aasdfa", forKey: "token")
let token = UserDefaults.standard.value(forKey: "token"
  

另外,你正在编写糟糕的编码,你必须要理解OOP的

let signInVC = SignInViewController()
signInVC.delegateToken = self
     

这将在内存和每个内容中重复出现   对象有自己的属性和行为。

答案 3 :(得分:0)

只需使用“准备segue”

"[{\"number\":\"INC0010075\",\"cmdb_ci\":\"hubot-test\",\"short_description\":\"test data for buisness rule 30\",\"category\":\"software\",\"comments\":\"\"}]"

答案 4 :(得分:0)

尝试使用:

protocol sendTokenDelegate: class {
    func sendToken(login:String)
}
class SignInViewController: UIViewController  {
    weak var delegateToken:sendTokenDelegate?
    func loginAzure(email: String, password: String) {
        token = "abcdefgh"
        if self.delegateToken != nil{
         self.delegateToken?.sendToken(login: token)
        }
    }
}


class ProfilePage: UIViewController, UITableViewDelegate, UITableViewDataSource, sendTokenDelegate {
    override func viewDidLoad() {
        //get your instantiateViewController from storyboard
        let signInVC = self.storyboard?.instantiateViewController(withIdentifier: "SignInViewControllerIdentifire") as! SignInViewController
        signInVC.delegateToken = self
    }
    func sendToken(login: String) {
        self.logInToken = login
        print("Login Token in Profile Page is \(login)")
    }
}