首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当一个ViewControllers打开时,如何在两个same中收到相同的回调?

在iOS开发中,可以通过代理模式或者通知中心来实现在两个相同的ViewControllers中收到相同的回调。

  1. 代理模式: 代理模式是一种常用的设计模式,可以用于实现对象之间的通信。在这种情况下,可以定义一个协议(protocol),并在两个ViewControllers中实现该协议。其中一个ViewController作为另一个ViewController的代理,当第一个ViewController需要发送回调时,通过代理方法将回调传递给第二个ViewController。

示例代码如下:

代码语言:txt
复制
// 定义协议
protocol CallbackDelegate: AnyObject {
    func didReceiveCallback()
}

// 第一个ViewController
class FirstViewController: UIViewController {
    weak var delegate: CallbackDelegate?

    func openSecondViewController() {
        let secondViewController = SecondViewController()
        secondViewController.delegate = self
        // 打开第二个ViewController
    }
    
    // 实现代理方法
    func didReceiveCallback() {
        // 处理回调
    }
}

// 第二个ViewController
class SecondViewController: UIViewController {
    weak var delegate: CallbackDelegate?

    func someAction() {
        // 触发回调
        delegate?.didReceiveCallback()
    }
}
  1. 通知中心: 通知中心是iOS提供的一种发布-订阅模式的机制,可以用于在不同对象之间进行通信。在这种情况下,可以在第一个ViewController中发送一个通知,而第二个ViewController监听该通知,并在接收到通知时执行相应的回调方法。

示例代码如下:

代码语言:txt
复制
// 第一个ViewController
class FirstViewController: UIViewController {
    func openSecondViewController() {
        let secondViewController = SecondViewController()
        // 注册通知
        NotificationCenter.default.addObserver(self, selector: #selector(didReceiveCallback), name: NSNotification.Name("CallbackNotification"), object: nil)
        // 打开第二个ViewController
    }
    
    // 发送通知
    @objc func didReceiveCallback() {
        NotificationCenter.default.post(name: NSNotification.Name("CallbackNotification"), object: nil)
    }
}

// 第二个ViewController
class SecondViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // 监听通知
        NotificationCenter.default.addObserver(self, selector: #selector(handleCallback), name: NSNotification.Name("CallbackNotification"), object: nil)
    }
    
    // 处理回调
    @objc func handleCallback() {
        // 处理回调
    }
}

以上是两种常用的方法来实现在两个相同的ViewControllers中收到相同的回调。根据具体的需求和场景,选择适合的方法来实现回调功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS 组件化-路由解耦思想 JLRoutes 实战篇(一)App内控制器跳转

, Router 同样, 使用前需要每台设备进行一次注册, Router 在内部保存每台设备 URL, 不同设备之间需要交互, 将消息发送到路由器中统一处理; 控制器之间需要交互跳转, 只需要将对应...Modal , 则传递一个参数; 看到这里相信认真阅读同学们已看出使用 Router 好处: 1....处理 Router : 也就是注册好 Router 之后, 调用相应 Router , 我们在注册写得方法, 这里是执行控制器跳转和传参逻辑。...Route 时会执行; 参数 parameters: 在执行 Route 传入参数; for (NSString* router in routerMapInfo.allKeys)...: 实例化控制器, 参数赋值, 页面跳转 #pragma mark - execute Router VC // 查找到指定 Router , 触发路由逻辑; 找不到已注册 Router

1.5K20

Cocoa编程中视图控制器与视图类详解

UIActionSheet  所有控件(控件是将用户触摸转换为触发器屏幕对象。)...不过,也可以视具体情况,我们直接在一个独立视图控制器创建UITabBarController实例对象,自定义一个用于视图 切换控制器类ViewSwitcherViewController,就可在其中...,以让UITabBarController能够正常触发这些方法。...控制器加载视图过程 调用视图控制器view属性,视图控制器会先调用loadView方法加载视图,因此,可以在loadView方法创建所有的视图,这是比较好编程惯例。...事件处理 如图所示,一般情况下,一个视图不响应用户事件,它会将事件传递给它父视图。但是,视图被视图控制器管理,它会将事件首先传递给视图控制器。

5.1K50
  • 阅读器多种翻页设计与实现

    ,对背面做一个自定义展示,需要打开self.pageVC.doubleSided = YES;; 初始化界面的时候和平移一样,但是在使用过程再调用-setViewControllers,如果animated...效果分解: 1、当用户滑动过程,视图要跟随手指移动; 2、当用户往上滑然后松开,视图要带有加速度往上滑动;(附加特性:在滑动过程中用户可以通过重复这个行为加速滑动) 3、在视图滑动过程...,才能实现效果分解附加特性。...B是我们创建一个vc,大小和UIScrollViewsize一样大;当我们向下滑动,我们创建vcA放在B上面; 当我们上滑到vcA完全展示时候,vcB已经滑动到屏幕外面(红色为窗口大小);...A: 在通过-setContentOffset:改变offset之后,仍会触发-scrollViewDidScroll:,如果在此又触发了offset改变,则进入了递归调用坑,从下图堆栈可以看到

    3.3K10

    Xcode:处理故事板更好方式 享受Interface Builder提示和技巧

    硬编码长字符串名称总是一个糟糕编程习惯。 您使用“if / else”或“switch”语句添加一些segues,PrepareForSegue方法将变得难看并且不可读。 有什么选择?...您想要按下按钮导航到下一个viewController,只需为此按钮添加一个IBAction,并在代码初始化此viewController:您采用建议#3,它实际上是一行代码。...有时导航流程应该将用户带回到前一个屏幕。 这是另一个常见错误:使用新segue导航以前viewController。...这听起来很简单,但在实践它需要一些额外步骤,只会让开发人员感到困惑: 通常,您为按钮创建动作插座,Interface Builder将为您创建代码。...在这种情况下,从按钮拖动到“退出”出口是期望代码已经在您项目中。 通常,您为按钮创建动作插座,它会将代码放在拥有该按钮一个

    1.4K30

    RxJS 入门到搬砖 之 Observable 和 Observer

    他填补了下表缺失点: SINGLE MULTIPLEXED Pull Function Iterator Push Promise Observable ,下面是一个 Observable,它在订阅立即...Promise (生产者)传递一个 resolved 值给注册(消费者),不过和函数不一样,Promise 自己负责精准确定该值何时 push 到。...在一些情况下 Observable 会表现地像 EventEmitter,使用 RxJS Subject 进行多播,但通常它们行为不像 EventEmitter。...RxJS Observer 也可能是部分。如果没有提供某种,Observable 也会正常执行,只不过一些类型通知会被忽略,因为他们在 Observer 找不到对应。...也可以不用将回放在一个 Observer 对象,只传一个 next 函数作为参数就可以。

    75220

    Android四大组件:BroadcastReceiver史上最全面解析

    Android系统在特定情况下与App之间消息通信 电话呼入时、网络可用时 c. 多线程通信 ---- 3....,将广播发送到BroadcastReceiver(一般情况下是Activity)相应消息循环队列; 消息循环执行拿到此广播,BroadcastReceiveronReceive()方法。...,将广播发送到BroadcastReceiver(一般情况下是Activity)相应消息循环队列; 消息循环执行拿到此广播,BroadcastReceiveronReceive()方法。...,会自动onReceive()方法 一般情况下,onReceive方法会涉及与其他组件之间交互,发送Notification、启动service等 默认情况下,广播接收器运行在UI线程,因此,onReceive...特别注意 对于不同注册方式广播接收器OnReceive(Context context,Intent intent)context返回值是不一样: 对于静态注册(全局+应用内广播),onReceive

    1.7K10

    物联网来了,你还不会蓝牙开发?

    2 原生API详细讲解 在BLE协议,有两个角色,周边(Periphery)和中央(Central);周边是数据提供者,中央是数据使用/处理者,一个中央可以同时连接多个周边,但是一个周边某一刻只能连接一个中央...初始化蓝牙(包含了动态授权蓝牙操作权限、打开蓝牙、判断设备是否支持蓝牙) 如果没有打开蓝牙,点击打开蓝牙提示框后,会在 该方法收到信息,打开后则开启扫描,否则则根据你自己需要进行操作。...如下图(注:下面方法大多数都可以根据你需要选择性实现,不需要可以不用实现): 收到onChanged(),则说明蓝牙设备数据发生改变了,通知程序作出改变。 3....如果想让APP内能够实时监听到蓝牙设备发来数据,则还需要设置一个通知(可以理解成注册监听吧)如下: 这里对几个重要做解读,当我们收到onLeScan(),则说明已经扫描到设备,只需要加入到你设备列表即可...,收到onConnectionChanged()方法,说明蓝牙连接状态已经改变,则只需要判断BleDevice状态即可,收到onServicesDiscovered(),说明已经搜索到蓝牙服务

    97320

    QT信号槽机制

    实际上是利用函数指针来实现,当我们希望某件事发生处理函数能够获得通知,就需要将回函数指针传递给处理函数,这样处理函数就会在合适时候调用回函数。...两个明显缺点: 它们不是类型安全,我们无法保证处理函数传递给函数参数都是正确函数和处理函数紧密耦合,源于处理函数必须知道哪一个函数被。...信号与槽 在QT,我们有技术之外选择,也即是信号槽机制。所谓信号与槽,其实都是函数。...特定事件被触发(如在输入框输入了字符)将发送一个信号,而与该信号建立连接槽,则可以接收到该信号并做出反应(激活Find按钮)。...一个信号可以连接多个槽 使用QObject::connect可以把一个信号连接到多个槽,而信号发射,将按声明联系顺序依次调用槽。

    82830

    全面分析前端网络请求方式

    success 类型: Function 请求成功后函数。 jsonp 在一个 jsonp请求重写回函数名字。这个值用来替代在 "callback=?"...使用 JSONP 形式调用函数 "myurl?callback=?" jQuery 将自动替换 ? 为正确函数名,以执行函数。"...可以发现,调用 reject有三种可能: 1.请求超时 2.请求失败 注意:和服务器建立简介,并收到服务器异常状态码 404、500等并不能触发 onerror。...网络故障时或请求被阻止,才会标记为 reject,跨域、 url不存在,网络异常等会触发 onerror。 所以使用fetch收到异常状态码都是会进入then而不是catch。...可跨域携带 异常处理 收到一个代表错误 HTTP 状态码,从 fetch()返回 Promise 不会被标记为 reject, 即使该 HTTP 响应状态码是 404 或 500。

    1.8K40

    音视频直播技术--Android视频采集(Camera2)

    系统会根据打开 Camera 设备状态结果,三个不同方法。 onOpened:表式成功打开了 Camera 。 onDisconnected:表式关闭了与 Camera 连接。...两个方法,这两个方法需要用户自己来实现,系统会根据 Session 创建状态结果不同方法: onConfigured:表式 Session 创建成功。...APP接收到preview创建成功后,就可以开始Camera设备相关操作了。 在CameraManager中找到一个合适 Camera 设备,得到其设备号。...摄像头被打开之后,系统就会 CameraDevice.StateCallback 类 onOpened 方法,在该方法 APP 可获取 CameraDevice 对象。...第一个参数是由前面讲 createCaptureRequest 创建 CaptureRequest.Builder对象生成。 第二个参数callback是Camera捕获对象。

    2K20

    WLAN 感知概览(Wi-Fi Aware)

    此时,您订阅将等待匹配发布服务器进入Wi-Fi范围发生这种情况,系统将执行onServiceDiscovered()方法可以使用此PeerHandle参数发送消息或创建到该发布服务器连接...您应用程序订阅服务。然后,它发现一个匹配发布者,应用程序从onServiceDiscovered()获取发布者PeerHandle。...要发送消息,请调用sendMessage()然后可能发生以下回对等端成功接收到消息,系统将调用发送应用程序onMessageSendSucceeded()。...对等方收到消息,系统调用接收应用程序onMessageReceived()。...Wi-Fi感知网络创建NetworkSpecifier不要指定端口网络连接可用、更改或丢失时,将调用相应方法。

    2.9K20

    QT信号槽机制

    实际上是利用函数指针来实现,当我们希望某件事发生处理函数能够获得通知,就需要将回函数指针传递给处理函数,这样处理函数就会在合适时候调用回函数。...两个明显缺点: 它们不是类型安全,我们无法保证处理函数传递给函数参数都是正确函数和处理函数紧密耦合,源于处理函数必须知道哪一个函数被。...信号与槽 在QT,我们有技术之外选择,也即是信号槽机制。所谓信号与槽,其实都是函数。...特定事件被触发(如在输入框输入了字符)将发送一个信号,而与该信号建立连接槽,则可以接收到该信号并做出反应(激活Find按钮)。...一个信号可以连接多个槽 使用QObject::connect可以把一个信号连接到多个槽,而信号发射,将按声明联系顺序依次调用槽。

    1.7K20

    Akka 指南 之「断路器」

    状态: 允许尝试一个调用通过,但不会快速失败 所有其他调用都会快速失败,异常情况与Open状态相同 如果第一次调用成功,断路器复位Closed状态,resetTimeout复位 如果第一次呼叫失败...它们在提供ExecutionContext执行 调用结果侦听器: 可用于收集有关所有调用统计信息,或对成功、失败或超时等特定调用结果做出反应 支持调包括:onCallSuccess...这两个 API 都被认为是Call Protection,因为无论是同步还是异步,断路器目的都是在调用另一个服务保护你系统免受级联故障影响。...故障将增加失败计数,失败计数达到maxFailures,断路器打开。但是,有些应用程序可能需要某些异常不增加失败计数,反之亦然,有时我们希望增加失败计数,即使调用成功。...另一方面,如果收到错误或超时,将会调用fail方法并触发故障,断路器将此故障累积到断路器打开计数。 注释:以下示例不会在状态为HalfOpen进行远程调用。

    55710

    zookeeper源码分析(9)-Curator相关介绍

    parentWatchers 其实在CuratorFramework client初始化时,会初始化一个watcher添加到ConnectionStateparentWatcher,负责连接状态改变会话状态改变...此外连接状态事件触发,parentWatcher也会这些listeners....,setData,可通过链式调用inBackground(callback)传入函数callback,这样操作完成后,会执行函数。...此外,每次注册watch是后台线程发起,会在他响应数据上注册一个函数,负责获得最新节点数据,节点数据与之前本地缓存不一样,触发ListenerContainer<NodeCacheListener...调用start方法,连接异常重连成功(通过启动注册connectionStateListener),每次收到节点上对应 watch都会根据条件重新构造相应TreeNode,注册对应node

    2.2K30
    领券