【问题标题】:One delegate Two classes一名代表 两班
【发布时间】:2017-09-15 02:27:50
【问题描述】:

我正在使用带有 GoogleMap 自动完成视图控制器的 UISearchController 将数据发送到我的视图控制器。 我有一个 Tabbar 控制器,我想将数据发送给我的 ViewController A 和 B。 我已经完成了所有必要的工作,但是当用户使用 UISearchController 时,只有一个 ViewController 会收到通知。

当我移动到另一个选项卡时,我尝试将每个选项卡的委托设置为零,例如,如果我从 ViewController A 移动到 B

我将 A 的委托设置为 nil,然后将 B 的委托设置为自身。

我对 swift 有点陌生,所以谁能帮我理解为什么这不起作用?

我尝试调试我的代码以查看我的委托是 nil 而不是。

这是我设置和取消设置委托的方式

 func setDelegate() {

    print("MapViewController is not nil")
    print(resultsViewController?.delegate)
    resultsViewController?.delegate = self
    print(resultsViewController?.delegate)

}

func unSetDelegate() {

    print("MapViewController is nil")
    resultsViewController?.delegate = nil

}

【问题讨论】:

  • 创建一个代表数组并通过循环通知所有代表
  • @ReinierMelian 我也有类似的问题,你能解释一下吗?

标签: ios swift google-maps delegates google-places-api


【解决方案1】:

您需要一个观察者模式,如果您需要一个类实例通知多个其他实例,您需要创建一个委托数组(称为观察者)并从该通知程序实例类注册和注销

更多信息Wikipedia Observer Pattern

示例代码

这是必须实现任何观察者类的协议

protocol GeotificationsManagerObserver : NSObjectProtocol{
    func nearestGeotificationsHasChanged(pgeotifications:[Geotification])
}

通知类

class GeotificationsManager: NSObject {
    
    /**...*//code
    
    fileprivate var observers : [GeotificationsManagerObserver] = []

    /**...*//code

}

观察者方法

extension GeotificationsManager
{
    func addGeotificationsManagerObserver(observer:GeotificationsManagerObserver)
    {
        for currentObs in self.observers {
            if(observer.isEqual(currentObs))
            {
                //we don't want add again
                return
            }
        }
        
        self.observers.append(observer)
    }
    
    func removeGeotificationsManagerObserver(observer:GeotificationsManagerObserver)
    {
        var observerIndex = -1
        for (index,currObserver) in self.observers.enumerated() {
            if(observer.isEqual(currObserver))
            {
                observerIndex = index
                break
            }
        }
        if(observerIndex != -1)
        {
            self.observers.remove(at: observerIndex)
        }
    }
    
    //here make the notification to all observers in observers array
    func nearestsGeotificationsHasChanged()
    {
        for currObserver in self.observers {
            currObserver.nearestGeotificationsHasChanged(pgeotifications: self.getNearesGeotifications())
        }
    }
    
}

重要 一旦您不需要收到通知,您必须删除观察者,否则您将遇到内存问题

示例:您可以在viewDidAppear 中添加UIViewController 作为观察者,并且可以在viewDidDisappear 中删除

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多