ViewController对象为nil

时间:2017-08-29 05:29:12

标签: ios swift

我有2个视图控制器 1. ViewController(VC)
2. WebViewController(WVC)

在VC中,我点击一个按钮,显示WVC。 在WVC中成功完成所有任务后,我想显示VC并在VC中执行特定功能。

现在,Storyboard包含一些对象,并使用单击和拖动添加到VC。 最初,它有一些值(不是零)。 我点击按钮,WVC被推,完成WVC中的所有任务后, VC被推了。

现在VC中的一些值是零。 错误,欢迎(UILabelUIView)是零... 而且还想在VC中调用一个函数。 怎么可能。?

代码

ViewController.swift

class LoginController:UIViewController,UITextFieldDelegate{
    @IBOutlet weak var password: UITextField!
    @IBOutlet weak var username: UITextField!
    @IBOutlet weak var error: UILabel!
    @IBOutlet weak var welocome: UILabel!

    ......

    @IBAction func BtnClicked(sender: AnyObject) {
     let webViewCnt = self.storyboard!.instantiateViewControllerWithIdentifier("WebViewController") as UIViewController
        self.navigationController?.pushViewController(webViewCnt, animated: true)
    }
    func doSomeProcess(){

    }
}

WebViewController.swift

class WebViewController: UIViewController, UITextFieldDelegate,UIWebViewDelegate {
 override func viewDidLoad() {
    super.viewDidLoad()
    webView.delegate = self

    self.start()
}
 func start(){
      ---- do some process ----
      dispatch_async(dispatch_get_main_queue(), { () -> Void in
        let ViewCont = self.storyboard!.instantiateViewControllerWithIdentifier("LoginController") as UIViewController

        self.navigationController?.pushViewController(ViewCont, animated: true)
        ViewController().doSomeProcess() // call viewcontroller doSomeProcess() function
       }
   })
 }
}

3 个答案:

答案 0 :(得分:1)

尝试弹出:

在这个start()方法中只需替换一行self.navigationController?.popViewController(animated: true) 而不是推动ViewController。

func start(){
      ---- do some process ----
      dispatch_async(dispatch_get_main_queue(), { () -> Void in
        let ViewCont = self.storyboard!.instantiateViewControllerWithIdentifier("LoginController") as UIViewController

        self.navigationController?.pushViewController(ViewCont, animated: true)
        ViewController().doSomeProcess() // call viewcontroller doSomeProcess() function
       }
   })
 }

<强>原因:

当您推送到任何ViewController时,故事板将创建ViewController的新引用,并且OOP说每个对象都有自己的属性和方法,这就是为什么推送视图控制器属性可能是nil假设由于ViewController的单独实例,您的username: UITextField!文本将为零。

要调用视图控制器的功能,您必须实现delegate,如果不是viewwillappear的每个其他时间都不能实现。{/ p>

答案 1 :(得分:1)

简单你正在推动VC到WVC, 在将WVC推送到NavigationController后,逻辑上如此。 它将WVC添加到导航堆栈的顶部。 &安培;从导航中弹出此WVC会更好地自动显示具有先前值的VC。

使用此

ViewController.swift

class LoginController:UIViewController,UITextFieldDelegate{
    @IBOutlet weak var password: UITextField!
    @IBOutlet weak var username: UITextField!
    @IBOutlet weak var error: UILabel!
    @IBOutlet weak var welocome: UILabel!
    var isBackFromWVC = false
    ......

    @IBAction func BtnClicked(sender: AnyObject) {
       let webViewCnt = self.storyboard!.instantiateViewControllerWithIdentifier("WebViewController") as UIViewController
        self.navigationController?.pushViewController(webViewCnt, animated: true)   
       isBackFromWVC = true
    }
    func doSomeProcess(){

    }
    func vieWillAppear(){
      if(isBackFromWVC){
        doSomeProcess()
      }
   }
}

WebViewController.swift

class WebViewController: UIViewController, UITextFieldDelegate,UIWebViewDelegate {
 override func viewDidLoad() {
    super.viewDidLoad()
    webView.delegate = self

    self.start()
 }
 func start(){
      ---- do some process ----
      dispatch_async(dispatch_get_main_queue(), { () -> Void in

         self.navigationController?.popViewController(animated:true)
       }
      })
  }
}

答案 2 :(得分:0)

根据我的理解,您可能想要解雇WVC并返回VC

WebViewController的{​​{1}}:

start()

并且在pop之后,您需要执行self.navigationController?.popViewController(animated: true) 功能。有几种方法可以做到这一点,我将在这里介绍一个。

doSomeProcess()

,实施ViewController

UINavigationControllerDelegate

当然你需要

func navigationController(_ navigationController: UINavigationController, animationCOntrollerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewCOntroller) -> UIViewControllerAnimatedTransitioning? {
    switch operation {
    case .pop:
        let to = toVC as! ViewController
        to.doSomeProcess()
    default:
        break
    }
    return nil
}

self.navigationController?.delegate = self 的{​​{1}}内。