一个代表两个班

时间:2017-09-15 02:27:50

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

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

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

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

我对swift有点新意,所以任何人都可以帮助我理解为什么这不起作用?

我已经尝试调试我的代码,看看我的代表是否为nil而不是。

以下是我设置和取消设置委托的方法

Xrm.Page.getAttribute("lookup_fieldname").fireOnChange();

1 个答案:

答案 0 :(得分:3)

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

更多信息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())
        }
    }

}

重要 如果您不需要通知,则必须删除观察者,否则会出现内存问题

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