ios - 一名委托(delegate)两类

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

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

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

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

我对 swift 有点陌生,所以有人可以帮助我理解为什么这不起作用吗?

我尝试调试我的代码,看看我的委托(delegate)是否为零,而事实并非如此。

这是我如何设置和取消设置委托(delegate)

 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

}

最佳答案

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

更多信息Wikipedia Observer Pattern

示例代码

This is the protocol that must implement any observer class

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

Notifier class

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

    /**...*//code

}

Observers methods

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 中删除

关于ios - 一名委托(delegate)两类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46230813/

相关文章:

ios - 如何初始化一个 Nib 为 Storyboard 的 UIViewController

ios8-Facebook sdk-如何使用 UIWebView 打开应用程序请求 url

ios - 发送了无法识别的选择器。 Objective-C 错误

ios - Swift 中的 MIN() 和 MAX() 并将 Int 转换为 CGFloat

swift - 从当前 iCloud 用户获取 CloudKit 记录

android - 通过 Intent 将地址传递给谷歌地图 Activity :

ios - 如何分离输入字符串并在 TableView 中填充它重复了多少次并将索引传递给下一个

ios - 在 iOS 的 Realm 中添加数据的问题

android - 作为 ListView 行的 fragment (Google Maps Android API v2)

android - LatLng 构造函数将纬度值更改为 -90.0