Ios 关闭视图时更改值
我有一个NowPlayingVC,作为MainVC(集合视图)的孩子,当第三个viewcontroller(SingleSoundVC)被解除时,我想更改NowPlayingVC中的textValue。 我通过代码做所有事情,我不明白为什么我的标签在解雇后仍然不可见。 如果我努力编码,它们工作得很好,但永远不会改变 当第三个视图被取消时,我可以正确打印,但是标签是空的,即使我可以在调试视图层次结构中看到它 我试过这样处理协议/委托: 协议Ios 关闭视图时更改值,ios,swift,uicollectionview,delegates,Ios,Swift,Uicollectionview,Delegates,我有一个NowPlayingVC,作为MainVC(集合视图)的孩子,当第三个viewcontroller(SingleSoundVC)被解除时,我想更改NowPlayingVC中的textValue。 我通过代码做所有事情,我不明白为什么我的标签在解雇后仍然不可见。 如果我努力编码,它们工作得很好,但永远不会改变 当第三个视图被取消时,我可以正确打印,但是标签是空的,即使我可以在调试视图层次结构中看到它 我试过这样处理协议/委托: 协议 protocol SendDataToAudioPla
protocol SendDataToAudioPlayerContainer {
func receiveData(data:Sound){
self.audioNameLabel.text = data.name
}
}
正在播放VC
NowPlayingVC: SendDataToAudioPlayerContainer
var audioNameLabel:UILabel = {
var lbl = UILabel()
lbl.numberOfLines = 0
lbl.textAlignment = .left
lbl.sizeToFit()
lbl.textColor = .black
return lbl
}
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
setupConstraints()
}
func setupViews() {
self.view.backgroundColor = .blue
self.view.addSubview(audioNameLabel)
}
func setupConstraints(){ //setup of constraints with SnapKit}
var delegate:SendDataToAudioPlayerContainer?
var singleSound: Sound?
@objc func dismissView(){
if self.delegate != nil {
print("data passed up")
let data = self.singleSound
delegate?.receiveData(data: data!)
self.dismiss(animated: true, completion: nil)
} else {self.dismiss(animated: true, completion: nil)
print("data is not passed")}
}
}
SingleSoundVC
NowPlayingVC: SendDataToAudioPlayerContainer
var audioNameLabel:UILabel = {
var lbl = UILabel()
lbl.numberOfLines = 0
lbl.textAlignment = .left
lbl.sizeToFit()
lbl.textColor = .black
return lbl
}
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
setupConstraints()
}
func setupViews() {
self.view.backgroundColor = .blue
self.view.addSubview(audioNameLabel)
}
func setupConstraints(){ //setup of constraints with SnapKit}
var delegate:SendDataToAudioPlayerContainer?
var singleSound: Sound?
@objc func dismissView(){
if self.delegate != nil {
print("data passed up")
let data = self.singleSound
delegate?.receiveData(data: data!)
self.dismiss(animated: true, completion: nil)
} else {self.dismiss(animated: true, completion: nil)
print("data is not passed")}
}
当我选择我现在作为MainVC的代表添加的项目时,我还必须添加这一点
MainVC-CollectionView
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let vc = MainVC()
let childVC = NowPlayingVC()
vc.delegate = childVC
ApiService.sharedInstance.downloadAudioFile(with: vc.singleSound!.audioId)
vc.modalPresentationStyle = .popover
present(vc, animated: true, completion: nil)
}
MainVC-CollectionView
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let vc = MainVC()
let childVC = NowPlayingVC()
vc.delegate = childVC
ApiService.sharedInstance.downloadAudioFile(with: vc.singleSound!.audioId)
vc.modalPresentationStyle = .popover
present(vc, animated: true, completion: nil)
}
您应该为NowPlayingVC创建一个属性,以引用同一实例:
var nowPlayingVC=nowPlayingVC()
协议
protocol SendDataToAudioPlayerContainer {
func receiveData(data:Sound){
self.audioNameLabel.text = data.name
}
}
应定义为:
protocol SendDataToAudioPlayerContainer {
func receiveData(data:Sound)
}
正在播放VC
NowPlayingVC: SendDataToAudioPlayerContainer
var audioNameLabel:UILabel = {
var lbl = UILabel()
lbl.numberOfLines = 0
lbl.textAlignment = .left
lbl.sizeToFit()
lbl.textColor = .black
return lbl
}
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
setupConstraints()
}
func setupViews() {
self.view.backgroundColor = .blue
self.view.addSubview(audioNameLabel)
}
func setupConstraints(){ //setup of constraints with SnapKit}
var delegate:SendDataToAudioPlayerContainer?
var singleSound: Sound?
@objc func dismissView(){
if self.delegate != nil {
print("data passed up")
let data = self.singleSound
delegate?.receiveData(data: data!)
self.dismiss(animated: true, completion: nil)
} else {self.dismiss(animated: true, completion: nil)
print("data is not passed")}
}
采用它来向音频层容器发送数据
协议:
加
MainVC-CollectionView
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let vc = MainVC()
let childVC = NowPlayingVC()
vc.delegate = childVC
ApiService.sharedInstance.downloadAudioFile(with: vc.singleSound!.audioId)
vc.modalPresentationStyle = .popover
present(vc, animated: true, completion: nil)
}
您应该为NowPlayingVC创建一个属性,以引用同一实例:
var nowPlayingVC=nowPlayingVC()
协议
protocol SendDataToAudioPlayerContainer {
func receiveData(data:Sound){
self.audioNameLabel.text = data.name
}
}
应定义为:
protocol SendDataToAudioPlayerContainer {
func receiveData(data:Sound)
}
正在播放VC
NowPlayingVC: SendDataToAudioPlayerContainer
var audioNameLabel:UILabel = {
var lbl = UILabel()
lbl.numberOfLines = 0
lbl.textAlignment = .left
lbl.sizeToFit()
lbl.textColor = .black
return lbl
}
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
setupConstraints()
}
func setupViews() {
self.view.backgroundColor = .blue
self.view.addSubview(audioNameLabel)
}
func setupConstraints(){ //setup of constraints with SnapKit}
var delegate:SendDataToAudioPlayerContainer?
var singleSound: Sound?
@objc func dismissView(){
if self.delegate != nil {
print("data passed up")
let data = self.singleSound
delegate?.receiveData(data: data!)
self.dismiss(animated: true, completion: nil)
} else {self.dismiss(animated: true, completion: nil)
print("data is not passed")}
}
采用它来向音频层容器发送数据
协议:
加
将您的代码上载到Github以帮助您变得更好为什么要设置
vc.delegate=childVC
?您应该将SingleSoundVC
委托设置为NowPlayingVC
将您的代码上载到Github,以帮助您获得更好的效果。为什么要设置vc.delegate=childVC
?您应该将SingleSoundVC
委托设置为NowPlayingVC
谢谢。我完全按照你说的做了,但即使我能正确传递数据,标签也不会更新。我试图通过addSubView将同一标签添加到NowPlaying视图,但从内存中我可以看到它添加到了其他地方。可能是因为我初始化audioNameLabel的方式错误?我像这样初始化它:var-namelab:UILabel={var-lbl=UILabel()lbl.textAlignment=.left-lbl.sizeToFit()lbl.text=“这是text”lbl.textColor=.black-lbl.font=UIFont(名称:“普通舱”,大小:16)返回lbl}()
我认为,每当我关闭控制器时,它都会创建一个新的UILabel。实际上,当您呈现SingleSoundVC时,PlayingVC仍在内存中,因此标签只创建一次。问题是lbl.sizeToFit()
没有提供任何信息,宽度和高度仍然为0。您应该在调用func receiveData(data:Sound){
以正确匹配文本后更新约束,或者根据标签的布局方式调用self.audionamelab.sizeToFit()。这取决于您在func setupConstraints()中的实现
谢谢。事实上,我正试图打印名称标签,但我在内存中看到了两个不同的代码。我尝试了任何方法,在委托方法中添加子视图,更新约束,但什么都没有……我开始认为这是SnapKit或XCode中的一个错误……谢谢。我完全按照您告诉我的做了,但即使我可以正确传递数据,label没有更新。我试图通过addSubView将同一标签添加到NowPlaying视图,但从内存中可以看到它添加到了其他地方。可能是我初始化audioNameLabel的方式错误?我像这样初始化它:var namelab:UILabel={var lbl=UILabel()lbl.textAlignment=.left lbl.sizeToFit()lbl.text=“这是text”lbl.textColor=.black lbl.font=UIFont(名称:“普通客舱”,大小:16)返回lbl}()
我认为,每当我关闭控制器时,它都会创建一个新的UILabel。实际上,现在播放VC在您演示SingleSoundVC时仍在内存中,因此标签只创建一次。问题是lbl.sizeToFit()
没有提供任何内容,宽度和高度仍然为0。您应该在调用func receiveData(data:Sound){
以正确匹配文本后更新约束,或者根据标签的布局方式调用self.audionamelab.sizeToFit()。这取决于您在func setupConstraints()中的实现
谢谢。实际上我正在打印名称标签,但我在内存中看到了两个不同的代码。我尝试了任何方法,在委托方法中添加子视图,更新约束,但什么都没有……我开始认为这是SnapKit或XCode中的错误。。。