【问题标题】:Change value when view is dismissed关闭视图时更改值
【发布时间】:2019-08-17 21:55:25
【问题描述】:

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

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

我尝试过这样的协议/委托:

协议

protocol SendDataToAudioPlayerContainer {
func receiveData(data:Sound){
     self.audioNameLabel.text = data.name
   }
}

NowPlayingVC

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}

}

SingleSoundVC

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")}

}

我还必须补充一点,当我选择添加 NowPlaying 作为 MainVC 代表的项目时

MainVC - 集合视图

  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)
}

【问题讨论】:

  • 上传你的代码到 Github 帮助你变得更好
  • 为什么要设置vc.delegate = childVC?您应该将 SingleSoundVC 委托设置为 NowPlayingVC

标签: ios swift uicollectionview delegates


【解决方案1】:

MainVC - 集合视图

您应该为 NowPlayingVC 创建一个属性以引用同一个实例: var nowPlayingVC = NowPlayingVC()

  func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    let vc = SingleSoundVC()
    vc.delegate = nowPlayingVC
    ApiService.sharedInstance.downloadAudioFile(with: vc.singleSound!.audioId)
    vc.modalPresentationStyle = .popover
    present(vc, animated: true, completion: nil)
}

协议

应该定义为:

    protocol SendDataToAudioPlayerContainer {
        func receiveData(data:Sound)
    }

NowPlayingVC

采用 SendDataToAudioPlayerContainer 协议: 添加

func receiveData(data:Sound){
         self.audioNameLabel.text = data.name
         **// update constraints here**
       }
    }

【讨论】:

  • 谢谢。我完全按照你告诉我的做了,但即使我可以正确传递数据,标签也不会更新。我尝试通过 addSubView 将相同的标签添加到 NowPlaying 视图,但从内存中我可以看到它在其他地方添加了它。
  • 可能是我初始化audioNameLabel的方式不对?我像这样初始化它:var nameLabel:UILabel = { var lbl = UILabel() lbl.textAlignment = .left lbl.sizeToFit() lbl.text = "This is text" lbl.textColor = .black lbl.font = UIFont(name: "Cabin-Regular", size: 16) return lbl }()
  • 我认为任何时候我关闭我的控制器它都会创建一个新的 UILABEL
  • 其实NowPlayingVC在你呈现SingleSoundVC的时候还在内存中,所以标签只创建了一次。问题是 lbl.sizeToFit() 没有给你任何东西,宽度和高度仍然为 0。你应该在调用 func receiveData(data:Sound){ 之后更新约束以正确适应文本,或者只是调用 self.audioNameLabel.sizeToFit() 取决于你如何布局标签。这取决于你在func setupConstraints() 中的实现
  • 谢谢。实际上我正在尝试打印 nameLabel,但我在内存中看到了 2 个不同的代码。我尝试了任何方法,在委托方法中添加子视图,更新约束,但什么都没有……我开始认为这是 SnapKit 或 XCode 中的错误……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多