一个委派两个类



我正在使用带有googlemap autococtete视图控制器的uisearchcontroller将数据发送到我的视图控制器。我有一个塔巴尔控制器,我想发送数据两个我的ViewController A和B。我完成了所有必要的作业,但是当用户使用UISearchController时,只有一个ViewController通知通知。

我尝试将每个选项卡的代表设置为零,例如,如果我从ViewController A移动到B

我将设置a的委托,然后将B的代表设置为自身。

我对Swift是新手,所以有人可以帮助我理解为什么这不起作用?

我尝试调试我的代码以查看是我的代表是零,事实并非如此。

这是我设置和解开委托的方式

 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
}

您需要一个观察者模式,如果您需要一个类实例通知到其他许多实例,则需要制作一组代表(称为观察者)(称为观察者),然后从该notifier实例中注册并登记并删除deregister班级

更多信息Wikipedia观察者模式

示例代码

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

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

Notifier类

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

中删除

最新更新