ios - 使用通知中心在if语句中触发函数

标签 ios swift notifications

每当用户从一个页面滚动到另一个页面时(所有这些都发生在启用分页的 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)

如果我给它一些常量rawValuePlayerView类中的“接收”(观察者)相同的,负责发布通知的函数就可以正常工作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/

相关文章:

ios - WKWebView 不从特定页面加载图像

swift - 当没有打开窗口时,Macos 应用程序正在关闭

Swift:如何跳过未使用的闭包参数

ios - 如何添加除 'self' 之外的通知观察者?

javascript - 将 window.location.href 与 Jquery Mobile 和 RequireJS 一起使用时如何避免出现空白页?

ios - 将数据从磁盘发送到服务器而不加载到 iOS 上的 ram

android - 如何为移动应用程序创建可集成模块

ios - 如何使用 UISwitch 关闭本地通知?

ios - 如何在通过向上滑动杀死whatsapp后存档whatsapp(iOS版本)通知处理

android - 清除旧 Activity ,这样它们就不会出现在新 Activity 中点击