我有两个viewcontrollers(SignInViewcontroller.swift
和ProfilePage.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)
}
}
答案 0 :(得分:1)
如果你是从SignUpViewController到ProfilePageViewController,你可以在获取你想要的logingAzure()后得到的singIn令牌时传递字符串值我假设:
如果您使用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
}
}
}
如果您使用的是self.navigationController?.pushViewController
let storyboard = UIStoryboard(name: "Profile", bundle: Bundle.main)
if let profileVC = storyboard.instantiateViewController(withIdentifier:
"ProfilePageViewController") as? ProfilePageViewController {
profileVC.loginToken = token
}
修改强>
如果您不想直接从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)")
}
}