2017-10-13 47 views
0

在这里,我有两个视图控制器,并在第二视图控制器按钮点击我希望在第一视图控制器更改标签的名称,这样的按钮,点击更改标签名称我怎么能做这个??如何创建委派到一个视图控制器上的另一个视图控制器

第一个视图控制器在这里我想更改用户名的标签文本

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; 
    } 
} 

第二个视图控制器从那里上登录按钮的点击要改变第一个视图控制器的标签名称

class LogInViewController: UIViewController , FBSDKLoginButtonDelegate , GIDSignInUIDelegate{ 
    @IBOutlet weak var loginButton: UIButton! 
    @IBOutlet weak var EnterEmail: UITextField! 
    @IBOutlet weak var EnterPassword: UITextField!  

    // Login in button 

    @IBAction func loginButtton(_ sender: UIButton) { 

     let email = EnterEmail.text?.lowercased() 
     let finalEmail = email?.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) 
     let password = EnterPassword.text 

     // var name: String! 
     // menuView = self.storyboard?.instantiateViewController(withIdentifier: "MenuViewController1") as! MenuViewController1 

     // Register user in firebase with validations 
     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 ")     
      } else { 
       self.displayMyAlertMessage(userMessage:"Registration Failed.. Please Try Again !")      
      } 
     }; 
     // self.navigationController?.pushViewController(MenuViewController1, animated: true) 
    } 
} 
+0

您能否让它更清楚哪两个sc reens推/显示哪个? LogInViewController'是否推/显示MenuViewController1或其他方式? – Glenn

+0

@Glenn LogInViewController必须显示在LogInViewController –

+0

点击按钮MenuViewController1它只是跟随代表团的概念,请参阅https://stackoverflow.com/questions/6168919/how-do-i-set-up-a-simple-代表之间的沟通之间的两个视图控制器 –

回答

2

我们假设MenuViewController将被通知LoginViewController已完成登录。的方式是:

首先,在LoginViewController创建协议LoginViewController,并声明委托

protocol LoginViewControllerDelegate:NSObjectProtocol { 
    func LoginDidFinish() 
} 

class LoginViewController: UIViewController{ 

    weak var delegate:LoginViewControllerDelegate? 
    //...... 
} 

,当登录结束时,调用委托方法

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

,在MenuViewController,分配selfLoginViewController代表创建LoginViewController时:

let loginViewController = LoginViewController() 
loginViewController.delegate = self 

最后,实现委托方法MenuViewController,它会被调用时,登录完成:

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

谢谢陈芸,但它仍然不打印登录去把在loginDidFinish写()函数... –

+0

就'self.delegate断点?.LoginDidFinish()'检查,如果它被称为。并确保'self.delegate'不是顺便说一句。 –

+0

是的,对.. self.delegate?.LoginDidFinish()这里是问题。发件人\t的UIButton \t 0x00007f962a55aaa0 自\t DivaStays.LogInViewController \t 0x00007f962a455510 电子邮件\t字符串? \t “[email protected]” \t一些 finalEmail \t字符串? \t “[email protected]” \t一些 密码\t字符串?\t“pooja @ 45ff”\t有些人在断点处得到了这个 –

相关问题