Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios swift 3中的协议和委托不在ViewController之间发送值_Ios_Swift - Fatal编程技术网

Ios swift 3中的协议和委托不在ViewController之间发送值

Ios swift 3中的协议和委托不在ViewController之间发送值,ios,swift,Ios,Swift,我有两个视图控制器(SignInViewcontroller.swift和ProfilePage.swift) 我想将字符串从SignenViewController传递到ProfilePageviewcontroller。 我在SignenViewController中创建了一个协议。我在ProfilePagecontroller中委托了该方法。当我通过协议发送字符串时,我没有在ProfilePageviewcontroller中收到该字符串,我错了。请帮助我解决问题。 这是我的密码: 登录查

我有两个视图控制器(
SignInViewcontroller.swift
ProfilePage.swift
) 我想将字符串从
SignenViewController
传递到
ProfilePage
viewcontroller
。 我在
SignenViewController
中创建了一个协议。我在
ProfilePage
controller
中委托了该方法。当我通过协议发送字符串时,我没有在
ProfilePage
viewcontroller
中收到该字符串,我错了。请帮助我解决问题。 这是我的密码:

登录查看控制器。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)
    }
}
class ProfilePage: UIViewController, UITableViewDelegate, UITableViewDataSource, sendTokenDelegate {
    override func viewDidLoad() {
        let signInVC = SignInViewController()
        signInVC.delegateToken = self
    }
    func sendToken(login: String) {
        self.logInToken = login
        print("Login Token in Profile Page is \(login)")
    }
}
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)
    }
}
class ProfilePage: UIViewController, UITableViewDelegate, UITableViewDataSource, sendTokenDelegate {
    override func viewDidLoad() {
        let signInVC = SignInViewController()
        signInVC.delegateToken = self
    }
    func sendToken(login: String) {
        self.logInToken = login
        print("Login Token in Profile Page is \(login)")
    }
}

当您要访问导航控制器中不存在的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
传递给SignenViewController时,委托将使用相反的大小写。

如果您的all API需要令牌,以便您可以在类级别声明或将其保存到UserDefauls:

1)

2)

UserDefaults.standard.set("aasdfa", forKey: "token")
let token = UserDefaults.standard.value(forKey: "token"
此外,您正在进行糟糕的编码,您必须理解OOP的功能

let signInVC = SignInViewController()
signInVC.delegateToken = self
这将重新感知内存中的seprate实例和每个 对象有自己的属性和行为


当您要访问导航控制器中不存在的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
传递给SignenViewController时,委托将使用相反的大小写。

如果您的all API需要令牌,以便您可以在类级别声明或将其保存到UserDefauls:

1)

2)

UserDefaults.standard.set("aasdfa", forKey: "token")
let token = UserDefaults.standard.value(forKey: "token"
此外,您正在进行糟糕的编码,您必须理解OOP的功能

let signInVC = SignInViewController()
signInVC.delegateToken = self
这将重新感知内存中的seprate实例和每个 对象有自己的属性和行为


如果您是从SignUpViewController到ProfilePageViewController,则可以在从logingAzure()获取所需的singIn标记后,在导航时传递字符串值。我假定:

  • 如果您使用segues->self.performsgue导航(带有标识符:“SignupProfile”,发件人:self)

  • 如果您使用的是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
    singleton,在登录或注册时处理令牌和其他资源来实现这一点

    如果您是从SignUpViewController到ProfilePageViewController,则可以在从logingAzure()获取所需的singIn令牌后,在导航时传递字符串值。我假定:

  • 如果您使用segues->self.performsgue导航(带有标识符:“SignupProfile”,发件人:self)

  • 如果您使用的是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中


    要做到这一点,请创建一个
    会话管理器
    单例,以便在登录或注册时处理令牌和其他资源

    在这种情况下,您需要一个对象来存储来自SignenViewController的令牌,直到ProfilePage请求它为止

    class TokenStorage {
        static let shared = TokenStorage()
        public var token: String = ""
    }
    
    然后您将收到令牌呼叫:

    TokenStorage.shared.token = receivedToken
    
    并在ProfilePage中请求它:

    print(TokenStorage.shared.token)
    

    在这种情况下,您需要一个对象来存储SignenViewController的令牌,直到ProfilePage请求它为止

    class TokenStorage {
        static let shared = TokenStorage()
        public var token: String = ""
    }
    
    然后您将收到令牌呼叫:

    TokenStorage.shared.token = receivedToken
    
    并在ProfilePage中请求它:

    print(TokenStorage.shared.token)
    
    只需使用“为赛格做准备”

    只需使用“为赛格做准备”

    尝试使用:

    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)")
        }
    }
    
    尝试使用:

    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)")
        }
    }
    


    您要将SignenViewController登录到ProfilePage吗?如何以及在何处显示
    SignenViewController
    ?是的。我想将字符串从SignenViewController发送到ProfilePage在哪里调用
    登录(电子邮件:string,密码:string)
    方法?登录后,我将得到响应。我不想演示SignenViewController。我只想在加载ProfilePage时传递字符串值,我想通过代理从SignenViewController获取令牌字符串。是否要将SignenViewController登录到ProfilePage?如何演示以及在何处演示
    SignenViewController
    ?是。我想从SignenViewController发送字符串到ProfilePageLoginzure(email:String,password:String)方法在哪里调用?登录后,我将得到响应。我不想演示SignenViewController。我只想在加载ProfilePage时传递字符串值,我想通过代理从SignenViewController获取令牌字符串。我不会直接从SignenViewController转到ProfilePage。在SignInViewController中,我获得JSON令牌。当我加载ProfilePage时,我想得到那个令牌。你在使用segua吗?我没有使用任何SEGUE,那么最好的方法就是使用UserDefault@NishantBhindi这是糟糕的编码风格如果你想在应用程序存在的时候保持变量,那么你必须使用
    UserDefault
    我不会直接从SignInViewController转到ProfilePage。在SignInViewController中,我获得JSON令牌。当我加载ProfilePage时,我想得到那个令牌。你在使用segua吗?我没有使用任何SEGUE,那么最好的方法就是使用UserDefault@NishantBhindi这是糟糕的编码风格如果你想在应用程序存在的时候保持变量,那么你必须使用
    UserDefault
    我没有使用任何segue.My n