使用通知中心触发if语句中的函数

时间:2017-06-12 09:46:27

标签: ios swift notifications

我想在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())

    }

}

2 个答案:

答案 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

变得虚假。