Ios 如何创建代理以在另一个视图控制器的按钮单击时更改一个视图控制器中的标签名称

Ios 如何创建代理以在另一个视图控制器的按钮单击时更改一个视图控制器中的标签名称,ios,swift,Ios,Swift,这里我有两个视图控制器,在第二个视图控制器中单击按钮,我想更改第一个视图控制器中的标签名称,那么我如何才能做到这一点 要更改用户名标签文本的第一个视图控制器 class MenuViewController1: UIViewController,UITableViewDataSource, UITableViewDelegate{ /** * Array to display menu options */ @IBOutlet var tblMenuOpt

这里我有两个视图控制器,在第二个视图控制器中单击按钮,我想更改第一个视图控制器中的标签名称,那么我如何才能做到这一点

要更改用户名标签文本的第一个视图控制器

class MenuViewController1: UIViewController,UITableViewDataSource, UITableViewDelegate{

    /**
     *  Array to display menu options
     */
    @IBOutlet var tblMenuOptions : UITableView!

    /**
     *  Transparent button to hide menu
     */
    @IBOutlet var btnCloseMenuOverlay : UIButton!

    /**
     *  Array containing menu options
     */
    var arrayMenuOptions = [Dictionary<String,String>]()

    /**
     *  Menu button which was tapped to display the menu
     */
    var btnMenu : UIButton!

    /**
     *  Delegate of the MenuVC
     */
    var delegate : SlideMenuDelegate?

  //  var delegateP: Profile?

    @IBOutlet weak var userProfilePhoto: UIImageView!

    @IBOutlet weak var userName: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        tblMenuOptions.tableFooterView = UIView()
        // Do any additional setup after loading the view.


        //let name = userName.text
        self.delegateP?.name_changed(name: userName.text!)

         }

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

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        updateArrayMenuOptions()
    }

    func updateArrayMenuOptions(){
        arrayMenuOptions.append(["title":"Home", "icon":"HomeIcon"])
        arrayMenuOptions.append(["title":"LogIn", "icon":"LogIn"])
        arrayMenuOptions.append(["title":"House Owner","icon":"House Owner"])
        arrayMenuOptions.append(["title":"ShortTerm", "icon":"ShortTerm"])
        arrayMenuOptions.append(["title":"LongTerm","icon":"LongTerm"])

        tblMenuOptions.reloadData()
    }

    @IBAction func onCloseMenuClick(_ button:UIButton!){
        btnMenu.tag = 0

        if (self.delegate != nil) {
            var index = Int32(button.tag)
            if(button == self.btnCloseMenuOverlay){
                index = -1
            }
            delegate?.slideMenuItemSelectedAtIndex(index)
        }

        UIView.animate(withDuration: 0.3, animations: { () -> Void in
            self.view.frame = CGRect(x: -UIScreen.main.bounds.size.width, y: 0, width: UIScreen.main.bounds.size.width,height: UIScreen.main.bounds.size.height)
            self.view.layoutIfNeeded()
            self.view.backgroundColor = UIColor.clear
        }, completion: { (finished) -> Void in
            self.view.removeFromSuperview()
            self.removeFromParentViewController()
        })
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cellMenu")!
        cell.selectionStyle = UITableViewCellSelectionStyle.none
        cell.layoutMargins = UIEdgeInsets.zero
        cell.preservesSuperviewLayoutMargins = false

        cell.backgroundColor = UIColor.clear


        let lblTitle : UILabel = cell.contentView.viewWithTag(101) as! UILabel
        let imgIcon : UIImageView = cell.contentView.viewWithTag(100) as! UIImageView

        imgIcon.image = UIImage(named: arrayMenuOptions[indexPath.row]["icon"]!)
        lblTitle.text = arrayMenuOptions[indexPath.row]["title"]!

        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let btn = UIButton(type: UIButtonType.custom)
        btn.tag = indexPath.row
        self.onCloseMenuClick(btn)
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrayMenuOptions.count
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1;
    }
}

我们假设
MenuViewController
将被告知
LoginViewController
已完成登录。方法是:

首先,使用
LoginViewController
创建一个协议,并在
LoginViewController
中声明一个委托

protocol LoginViewControllerDelegate:NSObjectProtocol {
    func LoginDidFinish()
}

class LoginViewController: UIViewController{

    weak var delegate:LoginViewControllerDelegate?
    //......
}
let loginViewController = LoginViewController()
loginViewController.delegate = self
第二步,登录完成后,调用委托方法

Auth.auth().createUser(withEmail: email!, password: password!) { (user, error) in
    if (error == nil && (finalEmail != "") && self.isValidEmail(testStr: finalEmail!)) && (password != " " && self.isPasswordValid(password!)){
        self.displayMyAlertMessage(userMessage:"You are successfully registered ")
        self.delegate?.LoginDidFinish() //Key point
    }else{
        self.displayMyAlertMessage(userMessage:"Registration Failed.. Please Try Again !")
    }
};
第三个,在
菜单视图控制器
中,在创建
登录视图控制器
时,将
自身
指定为
登录视图控制器
代理

protocol LoginViewControllerDelegate:NSObjectProtocol {
    func LoginDidFinish()
}

class LoginViewController: UIViewController{

    weak var delegate:LoginViewControllerDelegate?
    //......
}
let loginViewController = LoginViewController()
loginViewController.delegate = self
最后,在
MenuViewController
中实现委托方法,登录完成后将调用该方法:

//MARK: - LoginViewControllerDelegate
func LoginDidFinish() {
    print("Login did finish")
    //And change your label's text here.
}

我们假设
MenuViewController
将被告知
LoginViewController
已完成登录。方法是:

首先,使用
LoginViewController
创建一个协议,并在
LoginViewController
中声明一个委托

protocol LoginViewControllerDelegate:NSObjectProtocol {
    func LoginDidFinish()
}

class LoginViewController: UIViewController{

    weak var delegate:LoginViewControllerDelegate?
    //......
}
let loginViewController = LoginViewController()
loginViewController.delegate = self
第二步,登录完成后,调用委托方法

Auth.auth().createUser(withEmail: email!, password: password!) { (user, error) in
    if (error == nil && (finalEmail != "") && self.isValidEmail(testStr: finalEmail!)) && (password != " " && self.isPasswordValid(password!)){
        self.displayMyAlertMessage(userMessage:"You are successfully registered ")
        self.delegate?.LoginDidFinish() //Key point
    }else{
        self.displayMyAlertMessage(userMessage:"Registration Failed.. Please Try Again !")
    }
};
第三个,在
菜单视图控制器
中,在创建
登录视图控制器
时,将
自身
指定为
登录视图控制器
代理

protocol LoginViewControllerDelegate:NSObjectProtocol {
    func LoginDidFinish()
}

class LoginViewController: UIViewController{

    weak var delegate:LoginViewControllerDelegate?
    //......
}
let loginViewController = LoginViewController()
loginViewController.delegate = self
最后,在
MenuViewController
中实现委托方法,登录完成后将调用该方法:

//MARK: - LoginViewControllerDelegate
func LoginDidFinish() {
    print("Login did finish")
    //And change your label's text here.
}


您能更清楚地说明这两个屏幕中的哪一个按下/显示哪一个吗?
LogInViewController
push/show the
MenuViewController1
还是以其他方式?@Glenn LogInViewController必须在按钮上显示MenuViewController1单击LogInViewControllerit只是为了遵循委派的概念,请查看上面的链接是否帮不上忙,请告诉我。如果这个问题对你有帮助,请确保你选择了他的答案作为这个问题的答案。你能更清楚地说明两个屏幕中的哪一个按下/显示哪一个吗?
LogInViewController
push/show the
MenuViewController1
还是以其他方式?@Glenn LogInViewController必须在按钮上显示MenuViewController1单击LogInViewControllerit只是为了遵循委派的概念,请查看上面的链接是否帮不上忙,请告诉我。如果这个问题对您有帮助,请确保您选择了他的答案作为此问题的答案。谢谢陈云,但它仍然没有打印login Do finish在loginDidFinish()函数中编写的。请在
self.delegate?.loginDidFinish()上设置断点以检查是否正在调用它。顺便说一句,请确保
self.delegate
不是零。是的。。self.delegate?.LoginDidFinish()这里有个问题。发件人UIButton 0x00007f962a55aaa0 self DivaStays.LogInViewController 0x00007f962a455510电子邮件字符串?”pooja@gmail.com“一些最终邮件字符串?”pooja@gmail.com“一些密码字符串?”pooja@45ff“有些人是在家里买的,对不起,我不明白你的描述。谢谢陈云,但它仍然没有打印登录名。登录名是在loginDidFinish()函数中完成的。在
self.delegate?.loginDidFinish()上做一个断点,检查它是否被调用。顺便说一句,请确保
self.delegate
不是零。是的。。self.delegate?.LoginDidFinish()这里有个问题。发件人UIButton 0x00007f962a55aaa0 self DivaStays.LogInViewController 0x00007f962a455510电子邮件字符串?”pooja@gmail.com“一些最终邮件字符串?”pooja@gmail.com“一些密码字符串?”pooja@45ff“有些人是在这个时候得到的对不起,我不明白你的描述。