如何从AppDelegate调用函数时刷新UIViewController内容?

时间:2018-04-04 08:51:08

标签: ios swift

我从AppDelegate调用一个名为updateUI的函数,该函数存在于另一个视图控制器中,但在调用该函数tableView.isHidden = true后显示nil如何更新视图以便反映变化。

的AppDelegate:

if (rootViewController?.isKind(of: MovieDetailsViewController.self))!
{
   if notificationContentType == 1
   {
     movieDetailsVC.updateUI()
   }
}

查看控制器:

if currentrentalType == 1
                {
                        defaults.set("true", forKey: "isStillPlaying")
                        self.tableViewOutlet.isHidden = true
                        self.seekBarOutlet.isHidden = false
                        self.seekBarMaximumDurationLabelOutlet.text = self.convertTime(miliseconds: self.milisecondsForUpdateUI)
                        self.seekBarOutlet.maximumValue = Float(self.milisecondsForUpdateUI!)

                        let currentDate = NSDate()
                        let dateFormatter = DateFormatter()
                        dateFormatter.dateFormat = "yyyy-MM-dd, HH:mm:ss"
                        dateFormatter.timeZone = NSTimeZone(name: "IST") as TimeZone!
                        let date = dateFormatter.date(from: dateFormatter.string(from: currentDate as Date))
                        let currentDATE = date!.timeIntervalSince1970 * 1000

                        let movieStartDate = defaults.value(forKey: "MOVIE_START_DATE") as? Double

                        let difference = currentDATE - movieStartDate!

                        self.seekBarOutlet.setValue(Float(difference), animated: true)
                        let selectedValue = "\(Int(self.seekBarOutlet.value))"
                        let convertedValue = self.convertTime(miliseconds: Int(selectedValue)!)
                        self.seekBarMinimumDurationLabelOutlet.text = convertedValue

                        self.myTimer =  Timer.scheduledTimer(timeInterval:1, target: self, selector: #selector(self.updateSlider), userInfo: nil, repeats: true)
                }

我也试过了self.view.setNeedsDisplay()但是错误显示在viewController的viewDidLoad()tableView.delegate = self

  

错误:在解开可选值时意外发现nil

2 个答案:

答案 0 :(得分:0)

从App委托调用该函数时。控件直接进入该功能。 我认为tableViewOutlet和其他一些插座没有得到正确的定义。 (可能在viewdidload中定义,但未被调用) 代码不足以识别错误。

编辑:而不是从app delegate调用该函数。在UIViewController类和viewDidLoad上创建一个静态整数,检查该整数是否设置为1.如果是,则将其设置为0,然后在UI中执行所需的更改。

if (rootViewController?.isKind(of: MovieDetailsViewController.self))!
{
   if notificationContentType == 1
   {
     ViewControllerName.STATICINT = 1
   }
}

在VC中,在viewdidLoad中

if ViewControllerName.STATICINT == 1 {
 //required changes
 ViewControllerName.STATICINT = 0
}

答案 1 :(得分:0)

我希望你从storyboard创建了tableView的插座。崩溃的原因是,您在设置视图框架之前尝试访问tableview(任意)插座。

if (rootViewController?.isKind(of: MovieDetailsViewController.self))!
{
   if notificationContentType == 1
   {
     print(movieDetailsVC.view.frame)
     movieDetailsVC.updateUI()
   }
}

尝试打印Controller视图框,这个语句实际上会加载视图并设置它的框架,所以你的插座也应该被实例化。这只是一个解决方法,我希望它有所帮助。