gpt4 book ai didi

ios - 快速更改其他类中的字符串(不使其成为全局字符串)

转载 作者:行者123 更新时间:2023-11-28 15:35:28 24 4
gpt4 key购买 nike

我想修改另一个类中的string。然后,此类将在函数中使用该变量。

这是我到目前为止尝试过的方法。展开它时我总是遇到错误: fatal error :在展开可选值时意外发现 nil。有谁知道如何更改 urlString(最好不要将其设为全局)?我找不到 swift 的解决方案,它也涉及 stackoverflow 上的函数...如果您认为我将必须使其成为全局性的,请告诉我!

在类#1

let videoUrl =  "https:...sometestvideo.mov"
videoPlayerView.urlString = videoUrl

在类#2

var urlString : String?

//setup video player
func setupPlayerView() {

print(urlString)

//URL needed here
if let videoURL = NSURL(string: urlString!){ //here the error occurs

我想补充一点,在第二类中尽快调用该函数非常重要。因此我没有使用 setupPlayerView(_urlString)...

因此,它目前看起来像这样(class 2,一个 UIView):

override init(frame: CGRect){

super.init(frame: frame)

//function below this override init
setupPlayerView()

编辑:

首先感谢您的解答!尽管如此,仍然存在一个小问题(我认为立即调用该函数可以解决它......对于 swift 来说是一个新事物):即视频播放器(使用此函数设置)现在位于所有其他 subview 之上(一个只能看到覆盖整个屏幕的视频)尽管相反(视频使用整个屏幕但 subview 覆盖某些部分)。我将在下面提供更多关于添加其他 subview (所有这些都是闭包)和设置 View 的函数的代码。有没有办法让视频播放器保持在所有其他 subview 下方(即使它需要先从服务器加载)?你会建议我做什么?

下面的代码合并了第一个答案中的代码,但不一定要从那里开始

第 2 类

override init(frame: CGRect){

super.init(frame: frame)

setupPlayerView()

//add subview with controls (e.g. spinner)
controlsContainerView.frame = frame
addSubview(controlsContainerView)

//add to subview and center spinner in subview
controlsContainerView.addSubview(activityIndicatorView)
activityIndicatorView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
activityIndicatorView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true

//add various subviews
controlsContainerView.addSubview(whiteDummyView)
controlsContainerView.addSubview(userProfilePicture)
//... add further subviews

//enable interaction
controlsContainerView.isUserInteractionEnabled = true
//... set to true for other subviews as well

//function below this override init
defInteractions()

//backgorund color of player
backgroundColor = .black

}

//create controls container view (a closure, like the (most of the) other subviews)
let controlsContainerView: UIView = {

//set properties of controls container view
let controlView = UIView()
controlView.backgroundColor = UIColor(white: 0, alpha: 1)

return controlView

}()

函数setupPlayerView()

//setup video player
func setupPlayerView() {

//check URL if can be converted to NSURL
if let urlString = self.urlString, let videoURL = NSURL(string: urlString){

print(urlString)

//player's video
if self.player == nil {
player = AVPlayer(url: videoURL as URL)
}

//add sub-layer
let playerLayer = AVPlayerLayer(player: player)
self.controlsContainerView.layer.addSublayer(playerLayer)
playerLayer.frame = self.frame

//when are frames actually rendered (when is video loaded)
player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)

//loop through video
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem, queue: nil, using: { (_) in
DispatchQueue.main.async {
self.player?.seek(to: kCMTimeZero)
self.player?.play()
}
})

}

}

最佳答案

如果没有太多关于类之间关系的上下文,看起来一个可能好的解决方案是使用属性观察者模式。

class Class2 {
var urlString: String? {
didSet {
setupPlayerView()
}
}

override init(frame: CGRect){
super.init(frame: frame)
setupPlayerView()
}

func setupPlayerView() {
if let urlString = self.urlString, let videoURL = NSURL(string: urlString) {
// do stuff here
}
}
}

关于ios - 快速更改其他类中的字符串(不使其成为全局字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44345090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com