一名代表 两名 类
One delegate Two classes
我正在使用带有 GoogleMap 自动完成视图控制器的 UISearchController 将数据发送到我的视图控制器。
我有一个 Tabbar 控制器,我想发送两个 ViewController A 和 B 的数据。
我已经完成了所有必要的工作,但是当用户使用 UISearchController 时只有一个 ViewController 收到通知。
当我移动到另一个选项卡时,我尝试将每个选项卡的委托设置为 nil,例如,如果我从 ViewController A 移动到 B
我先把A的delegate设置为nil,再把B的delegate设置为自己。
我对 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
}
你需要一个观察者模式,如果你需要一个 class 实例通知许多其他实例,你需要创建一个委托数组(称为观察者)并从该通知实例注册和注销 class
更多信息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
中将其删除
我正在使用带有 GoogleMap 自动完成视图控制器的 UISearchController 将数据发送到我的视图控制器。 我有一个 Tabbar 控制器,我想发送两个 ViewController A 和 B 的数据。 我已经完成了所有必要的工作,但是当用户使用 UISearchController 时只有一个 ViewController 收到通知。
当我移动到另一个选项卡时,我尝试将每个选项卡的委托设置为 nil,例如,如果我从 ViewController A 移动到 B
我先把A的delegate设置为nil,再把B的delegate设置为自己。
我对 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
}
你需要一个观察者模式,如果你需要一个 class 实例通知许多其他实例,你需要创建一个委托数组(称为观察者)并从该通知实例注册和注销 class
更多信息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