即使在使用 view.setNeedsDisplay() 刷新视图后,.isHidden 属性也不反映对视图的更改
Posted
技术标签:
【中文标题】即使在使用 view.setNeedsDisplay() 刷新视图后,.isHidden 属性也不反映对视图的更改【英文标题】:.isHidden property does not reflect changes to the view even after refreshing the view using view.setNeedsDisplay() 【发布时间】:2018-04-06 09:01:24 【问题描述】:从应用程序委托接收到我传递一个静态字符串并使用set需要布局刷新movieDetailsViewController,功能和代码正常工作,但更改不会反映在视图中。
AppDelegate:-
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let movieDetailsVC = storyboard.instantiateViewController(withIdentifier: "MovieDetailsViewController") as! MovieDetailsViewController
if (rootViewController?.isKind(of: MovieDetailsViewController.self))!
if notificationContentType == 1
movieDetailsVC.FROMPAGE = "FROMAPPDELEGATE"
movieDetailsVC.view.setNeedsDisplay()
视图控制器:-
override func viewDidLoad()
super.viewDidLoad()
let appDelegate: AppDelegate? = UIApplication.shared.delegate as? AppDelegate
appDelegate?.read()
if FROMPAGE == "FROMAPPDELEGATE"
// self.updateUI()
print("Function is Called")
//print(self.view.frame)
//self.view.setNeedsDisplay()
let appDelegate: AppDelegate? = UIApplication.shared.delegate as? AppDelegate
appDelegate?.read()
var currentreleaseId : Int!
var currentrentalType : Int!
currentreleaseId = resultDictionaryFromFCM.value(forKey: "releaseId") as? Int
let convertedId = String(currentreleaseId)
currentrentalType = resultDictionaryFromFCM.value(forKey: "rentalType") as? Int
let elapsedTime = resultDictionaryFromFCM.value(forKey: "elapsedTime") as? Float
if convertedId == ApiClassStruct.RELEASEID
let movieStartDate = resultDictionaryFromFCM.value(forKey: "clientStartTime") as? Double
defaults.set(movieStartDate, forKey: "MOVIE_START_DATE")
if currentrentalType == 1
defaults.set("true", forKey: "isStillPlaying")
self.tableViewOutlet.isHidden = true
self.seekBarOutlet.isHidden = false
let maximumDuration = defaults.integer(forKey: "MAXIMUMDURATION")
self.seekBarMaximumDurationLabelOutlet.text = self.convertTime(miliseconds: maximumDuration)
self.seekBarOutlet.maximumValue = Float(maximumDuration)
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)
print("Play condition ended")
但是变化没有反映出来,在这个问题上停留了很长时间。
【问题讨论】:
您所说的更改未反映是什么意思?你确认在设置movieDetailsVC.FROMPAGE = "FROMAPPDELEGATE"
之前没有调用viewDidLoad
吗?
它没有被调用,它是在我在 appDelegate 中编写的 movieDetailsVC.setNeedsDisplay() 之后调用的。通过没有反映的更改,我的意思是如果条件为真,应该显示 seekBarView 但不应该隐藏 tableView 但不会隐藏。
显示代码如何呈现movieDetailsVC
当我收到通知时,在 appDelegate 中检查了条件,我调用了 setNeedsDisplay() 我想更新或说它,因为我想刷新视图,只需要来回刷新。
let movieDetailsVC = storyboard.instantiateViewController(withIdentifier: "MovieDetailsViewController") as! MovieDetailsViewController
创建一个新对象。您正在对这个新对象进行设置。如果实例已经存在,则不会受到影响。
【参考方案1】:
let movieDetailsVC = storyboard.instantiateViewController(withIdentifier: "MovieDetailsViewController") as! MovieDetailsViewController
创建MovieDetailsViewController
的新实例,并对其进行修改。如果您不提供该实例,则不会看到任何更改。如果您已经提交了MovieDetailsViewController
实例,则提交的实例将不受其影响。
我建议使用通知来通知MovieDetailsViewController
更新其 UI。
例如,在应用程序委托中使用它来创建和发布新通知:
NotificationCenter.default.post(name: NSNotification.Name("movieDetailsUpdateNotif"),
object: self, userInfo: nil)
然后在MovieDetailsViewController.viewDidLoad
注册收听这些通知:
override func viewDidLoad()
super.viewDidLoad()
NotificationCenter.default.addObserver(self,
selector: #selector(receiveNotification(notification:)),
name: NSNotification.Name("movieDetailsUpdateNotif"),
object: nil)
要清理它,请在deinit
中注销(只是为了表现得好):
deinit
NotificationCenter.default.removeObserver(self)
最后,实现MovieDetailsViewController.receiveNotification(notification:)
来处理通知:
@objc fileprivate func receiveNotification(notification: NSNotification)
// update UI here, e.g. hide things, show other, etc.
// this will be called when AppDelegate creates a and posts that notification
【讨论】:
以上是关于即使在使用 view.setNeedsDisplay() 刷新视图后,.isHidden 属性也不反映对视图的更改的主要内容,如果未能解决你的问题,请参考以下文章
即使在使用 await [重复] 之后,Javascript 也难以使用承诺值
即使在使用属性 multiple = false 不起作用后也禁用多个文件选择