【问题标题】:Delegates: pass data without segue代表:无segue传递数据
【发布时间】:2018-02-26 07:20:36
【问题描述】:

我有两个简单的类通过委托传递信息,如下所示:

protocol VCBDelegate: class {
func buttonDidPress() }

class ViewControllerBefore: UIViewController {

weak var delegate: VCBDelegate?
let vc = ViewController()

override func viewDidLoad() {
    super.viewDidLoad()
    self.delegate = vc
}

@IBAction func press(_ sender: Any) {
    delegate?.buttonDidPress()
} }

class ViewController: UIViewController, VCBDelegate {

override func viewDidLoad() {
    super.viewDidLoad()
}

一切正常,并且触发了 buttonDidPress 函数。 但我的问题是,如果我想重新加载集合视图,那么集合视图为零,因为我在 ViewControllerBefore 类中实例化 ViewController 对象的方式。 请记住,我不能在 segue 中分配委托,因为两个视图控制器没有连接。

请看下面的 buttonDidPress 函数:

func buttonDidPress() {         
  dataCell.infoCell.insert(addDataCell.getBuyCell(), at: 0)
  self.cvHome.reloadData()
}

【问题讨论】:

  • 是的,它们是相连的,因为它们都在同一个视图层次结构中(或者至少它们应该是)。 let vc = ViewController() 肯定是错误的做事方式。两个控制器如何相互关联,它们的工作是什么,它们是同一个父级的子级,一个是另一个的父级/容器吗?
  • 上面那个是我的app的简化版,但基本上有一个Tab Bar Controller --> Navigation Controller --> View Controller。
  • 然后从标签栏控制器 --> 另一个视图控制器 --> 用标识符实例化之前的视图控制器

标签: ios swift


【解决方案1】:

在这些情况下,我喜欢将数据存储在 dataSource 中。设置后,我可以从应用程序中的任何位置访问数据。

class PageDataSource {

    var theData : [Any]?

    static let sharedInstance = PageDataSource()
    private init() {}
}

为了确保我通过 delegate 传递信息并将其存储到 dataSource 我这样做:

func doDelegate() {
    PageDataSource.sharedInstance.theData = whatever
    passData(whatever)
    dismiss(true, nil)
}

然后我确保tableViewcollectionViewPageDataSource.sharedInstance.theData 获取所需的信息,例如:

// MARK: CollectionView DataSource
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if PageDataSource.sharedInstance.theData.count >= 1 {
            return PageDataSource.sharedInstance.theData.count
        }
        return 0
    }

【讨论】:

  • 我明白你的意思,但我将不得不重新构建我的整个应用程序。有没有其他办法?
  • 如果您可以在问题中提供更多详细信息,我可以提供更量身定制的解决方案。代表正在传递什么数据?当它通过时你会怎么做?你是如何处理表格视图的?
  • 其实并没有传递任何数据,我只想确认按下了一个按钮。按下该按钮后,在 ViewController 中我会进行一些更改并重新加载表格视图。我以前用一个简单的 NSNotification 来做,但它会产生问题,比如被多次调用。
  • 在 Vc 中用tableView 声明一个Bool,并通过委托为其分配值true。然后,当您有 tableView 加载数据时,以一种方式在 false 上加载,另一种方式在 true 上加载
  • 我已经尝试过这个解决方案,但不幸的是 reload 方法没有获取通过委托方法修改的更新数据
猜你喜欢
  • 2017-03-27
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多