Ios 关闭视图时更改值

Ios 关闭视图时更改值,ios,swift,uicollectionview,delegates,Ios,Swift,Uicollectionview,Delegates,我有一个NowPlayingVC,作为MainVC(集合视图)的孩子,当第三个viewcontroller(SingleSoundVC)被解除时,我想更改NowPlayingVC中的textValue。 我通过代码做所有事情,我不明白为什么我的标签在解雇后仍然不可见。 如果我努力编码,它们工作得很好,但永远不会改变 当第三个视图被取消时,我可以正确打印,但是标签是空的,即使我可以在调试视图层次结构中看到它 我试过这样处理协议/委托: 协议 protocol SendDataToAudioPla

我有一个NowPlayingVC,作为MainVC(集合视图)的孩子,当第三个viewcontroller(SingleSoundVC)被解除时,我想更改NowPlayingVC中的textValue。 我通过代码做所有事情,我不明白为什么我的标签在解雇后仍然不可见。 如果我努力编码,它们工作得很好,但永远不会改变

当第三个视图被取消时,我可以正确打印,但是标签是空的,即使我可以在调试视图层次结构中看到它

我试过这样处理协议/委托:

协议

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中的错误。。。