我想在if语句中使用通知中心来触发函数(setupPlayerView
),只要用户从一个页面滚动到另一个页面(所有这些都发生在启用了分页的滚动视图中):我想要在某些视图中设置视频播放器。为了更加精确,我希望当前和以下页面设置视频播放器。每个页面都包含一个视频播放器(或者更确切地说可以包含一个视频播放器,因为我只想在调用时设置它们)。为了达到这个目的,我使用了一个名为PlayerView
的类(在我的scrollview中的for循环,因为它对于每个页面都是相同的),其中我有设置视频播放器的功能,我也有以下代码用于接收来自通知中心的通知:
var urlString: String?
var pageNo: String?
var called = false
override init(frame: CGRect){
//...
if self.called == false, self.urlString != nil, self.pageNo != nil {
if self.pageNo == "0" {
NotificationCenter.default.addObserver(self, selector: #selector(self.setupPlayerView), name: NSNotification.Name(rawValue: "0 1"), object: nil)
}
else {
let previousPage = String(Int(self.pageNo!)! - 1)
let rawString = previousPage + " " + self.pageNo!
NotificationCenter.default.addObserver(self, selector: #selector(self.setupPlayerView), name: NSNotification.Name(rawValue: rawString), object: nil)
}
}
}
正如您所看到的,只有设置了某些变量才能实现这一切。这些变量也通过scrollview设置,如下面的代码所示(在scrollview中for循环内部,因为每页都有):
let videoUrl = "https://testvideo.mov"
let pageNoInPlayer = pageIndex
//add Subview with videoplayer frame to individual "pages"
let videoPlayerFrame = CGRect(x: 0, y: 0, width: pageSize.width, height: pageSize.height) //page covers entire screen
let videoPlayerView = PlayerView(frame: videoPlayerFrame)
videoPlayerView.urlString = videoUrl
videoPlayerView.pageNo = String(pageNoInPlayer)
负责发布通知的功能可以正常工作,如果我给它一些rawValue
和"接收" (观察者)在PlayerView
类中与if语句之外的rawValue
相同。发布通知时为什么不调用它?是因为如果?这些值应该由当时设定......
为了测试是否设置了值,我使用了didSet
:
var urlString: String? {
didSet {
print(urlString ?? String())
}
}
答案 0 :(得分:0)
rawValue用于识别通知;通常,这应该是一个常量值(不是在运行时确定的某些字符串)。此外,您显示有条件的代码会添加通知观察者。更有可能的是,你想要这样的东西:
override init(frame: CGRect){
//...
NotificationCenter.default.addObserver(self, selector: #selector(self.setupPlayerView), name: NSNotification.Name(rawValue: someConstant), object: nil)
}
func setupPlayerView() {
if (isCurrentView && otherConditions) {
// do whatever you want
}
}
请注意,无论初始化时类的状态如何,都会添加通知。 Init()只被(通常)调用一次;在UIPageViewController中切换页面将临时存储以前的视图控制器,而无需重新初始化以提高效率。
还有一件事:使用NotificationCenter通常是组织不良的代码的补丁。可能有更好的方法来构建您的逻辑,但我不能仅根据您提供的代码进一步发表评论。
答案 1 :(得分:0)
将您的PlayerView初始化程序更改为
init(frame:CGRect,pageNo:String,urlString:String)
并传递pageNo和urlString作为参数,因为在为pageNo赋值之前,urlString初始化程序已执行且条件为
如果self.called == false,self.urlString!= nil,self.pageNo!= nil
变得虚假。