每当用户从一个页面滚动到另一个页面时(所有这些都发生在启用分页的 ScrollView 中),我想使用 if 语句内的通知中心来触发函数 (setupPlayerView
):我想在某些 View 中设置视频播放器。更准确地说,我希望在当前页面和下一页中设置视频播放器。每个页面都包含一个视频播放器(或者更确切地说可以包含一个视频播放器,因为我只想在调用时设置它们)。为了实现这一点,我使用一个名为 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
类中的“接收”(观察者)相同的,负责发布通知的函数就可以正常工作rawValue
在 if 语句之外。为什么发布通知时不调用它?是因为if吗?到那时这些值应该已经设置好了...
为了测试值是否已设置,我使用了有效的 didSet
:
var urlString: String? {
didSet {
print(urlString ?? String())
}
}
最佳答案
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 中切换页面将临时存储以前的 View Controller ,而无需重新初始化,以提高效率。
还有一件事:使用NotificationCenter通常是对组织不良的代码的修补程序。可能有更好的方法来构建您的逻辑,但我无法仅根据您提供的代码进行进一步评论。
关于ios - 使用通知中心在if语句中触发函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44496318/