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

从子视图控制器调用函数不起作用

在iOS开发中,从子视图控制器(子VC)调用父视图控制器(父VC)的函数可能会遇到一些问题。以下是一些基础概念和相关解决方案:

基础概念

  1. 视图控制器层级:在iOS应用中,视图控制器可以嵌套在其他视图控制器中,形成一个层级结构。
  2. 委托(Delegate)模式:一种设计模式,用于在不同对象之间传递消息和数据。
  3. 闭包(Closure):一种可以捕获和存储上下文的匿名函数。

相关优势

  • 解耦:通过委托或闭包,可以将子VC和父VC之间的耦合度降低。
  • 灵活性:允许子VC在不直接依赖父VC的情况下通知父VC执行某些操作。

类型与应用场景

  1. 委托模式:适用于需要子VC通知父VC执行特定操作的场景。
  2. 闭包:适用于需要在子VC中执行一些操作并返回结果的场景。

遇到的问题及原因

从子视图控制器调用父视图控制器的函数不起作用,通常有以下几种原因:

  1. 未正确设置委托:父VC没有设置子VC的委托,或者委托方法未实现。
  2. 生命周期问题:父VC可能在子VC尝试调用其方法时还未完全初始化。
  3. 引用问题:子VC可能没有正确持有父VC的引用。

解决方案

使用委托模式

  1. 定义协议
  2. 定义协议
  3. 父VC实现协议
  4. 父VC实现协议
  5. 子VC设置委托
  6. 子VC设置委托
  7. 在父VC中设置子VC的委托
  8. 在父VC中设置子VC的委托

使用闭包

  1. 父VC传递闭包
  2. 父VC传递闭包
  3. 子VC接收并调用闭包
  4. 子VC接收并调用闭包

示例代码

以下是一个完整的示例,展示了如何使用委托模式从子VC调用父VC的函数:

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

// 父VC
class ParentViewController: UIViewController, ParentViewControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        let childVC = ChildViewController()
        childVC.delegate = self
        addChild(childVC)
        view.addSubview(childVC.view)
        childVC.didMove(toParent: self)
    }

    func parentViewControllerDidSomething() {
        print("Parent VC did something")
    }
}

// 子VC
class ChildViewController: UIViewController {
    weak var delegate: ParentViewControllerDelegate?

    func someFunction() {
        delegate?.parentViewControllerDidSomething()
    }
}

通过上述方法,可以有效地从子视图控制器调用父视图控制器的函数,并解决常见的相关问题。

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

相关·内容

深入理解javascript中的继承机制(2)临时构造函数模式Uber – 从子对象调用父对象的接口将继承部分封装成函数

为了解决前文提到的将共有的属性放进原型中这种模式产生的子对象覆盖掉父对象同名属性的问题,就出现了另一种模式,我们称作为临时构造函数模式 临时构造函数模式 我们具体通过代码来分析 function Shape...F,然后将Shape构造函数的原型对象赋给F的原型。...Uber – 从子对象调用父对象的接口 传统的面向对象的编程语言都会有子对象访问父对象的方法,比如java中子对象要调用父对象的方法,只要直接调用就可以得到结果了。...uber属性,同时使他指向父对象的原型,然后更改了Shape的toString函数,更新后的函数,会先检查this.constructor是否有uber属性,当对象调用toString时,this.constructor...就是构造函数,找到了uber属性之后,就调用uber指向的对象的toString方法,所以,实际就是,先看父对象的原型对象是否有同String,有就先调用它。

1.6K20
  • angularjs 控制器、作用域、广播详解

    一、控制器 首先列出几种我们平常使用控制器时的几种误区: 我们知道angualrJs中一个控制器时可以对应不同的视图模板的,但这种实现方式存在的问题是: 如果视图1和视图2根本没有任何逻辑关系,这样“控制器...在使用控制器时要注意几点: 1.不要去复用controller,一个控制器一般只负责一小块视图;(一般控制器处理的都是业务逻辑,业务逻辑的复用性一般很小) 2.不要在controller中操作DOM,这不是控制器的职责...;(因为在 controller里面操作DOM会导致浏览器页面的重绘,这种代价是昂贵的) 3.一般不要在控制器里面做数据过滤操作,ng有$filter服务; 一般来说,Controller是不会相互调用的...$scope是表达式的执行环境(或者叫做作用域)(它是视图和控制器之间的胶水); 3....,将数据模型的变化在整个应用范围内进行通知,但一般我们不太会手动去调用$scope.

    1.9K51

    WinCC VBS 脚本的实用技巧问答 (TIA Portal )

    同时内部变量 “HMI_Tag_02” 的“更改数值”事件下又调用一个脚本。 结果:这个脚本不会被执行。 解决办法 使用和控制器通讯的外部变量。请注意,通过使用外部变量可以规避上述安全机制。...WinCC Professional在用户定义的C函数里可以调用DLL函数 (DLL = Dynamic Link Library) 。 5、如何用VBS脚本确定鼠标当前的位置?...在 “ Parameter ” 表格中您以创建脚本变量用来将内部变量或控制器变量传入在脚本需要的时候。 组态函数返回值,在脚本中为脚本的名称分配表达式。 例如 组态函数类型,。...注意 定义一个 "by reference" 的参数 ,这意味着作为 "By_Ref " 参数,仅对脚本中定义的和引用的变量产生影响,对 HMI 内部变量或者控制器变量不起作用。...对象的属性修改仅是暂时的,当屏幕更改后视图使用组态时的配置。 21、如何在运行时选择一个画面对象(例如输入输出域)?

    5.5K20

    TP5视图和模板

    模板:在这里我理解为视图就是模板,在fetch,display等方法中传入的模板参数就是视图文件的路径。 模板引擎:就是生成、解析模块的一个机制或者一个封装的操作。...视图中fetch、display方法如何区别及使用 继承了\think\Controller类的控制器中可以直接调用$this->fetch('hello',['name'=>'thinkphp']...$config = []) { return $this->view->fetch($template, $vars, $replace, $config); } 其实调用的也是...定义的内容必须在view_replace_str中以数组的形式存储,否则可能会不起作用。 模板变量输出 模板中可以输出变量,当然是由于模板引擎的作用。...此外关于变量还可以进行一些运算操作和函数的使用。 感悟 官方完全开发手册反反复复看了几遍,有时去看看源码,有时依然懵逼。

    93340

    浅析 SpringMVC 原理和配置.

    一、原理       Spring MVC基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,它能够帮你构建像Spring框架那样灵活和松耦合的Web应用程序,将请求处理的逻辑和视图中的渲染实现解耦...所以控制器还会返回视图相关的东西。Spring 有个思想就是前后端分离,为了和视图解耦,所以控制器只返回了视图名。即,这里控制器返回了模型和视图名(modelAndViews)。...tips:Model 实际上就是一个Map(也就是key-value对的集合),它会传递给视图,这样数据就能渲染到客户端了,当调用addAttribute()方法并且不指定key的时候,那么key会根据值的对象类型推断确定...--哪些用户应该具有受保护资源的访问权 如果没有 ,配置实际上是不起作用的。...mapping 的顺序进行调用的。

    1K90

    Joints

    03 — 关节控制器 有许多不同的方法能够控制关节,在此之前我们讨论一下“松散控制器”和“精确控制器”之间的区别:一个松散控制器将不能在每一个可能的调节步骤中提供新的控制值(一些常规步骤可能会被跳过,...子脚本将在每个模拟步骤中调用,而不是在每个物理引擎计算步骤中调用。这意味着,如果以常规方式从子脚本控制关节,那么对于10个物理引擎计算步骤,您只能提供一次新的控制值:您将丢失9个步骤。...另一个更好的选择是使用一个联合回调函数(或者一个动态回调函数),这将在后面解释。...PID和弹簧/阻尼器参数可以从子脚本、远程API客户端、ROS或BlueZero节点更新。请参考对象参数IDs 2002-2004和2018-2019。...当需要一个精确的定制控制器时,应该使用联合回调函数(或动态回调函数)。

    1.3K20

    External controller tutorial

    但是,编写脚本有几个缺点:不能选择编程语言,不能拥有最快的代码,并且除了Lua扩展库之外,不能直接访问外部函数库。 另一种控制机器人或仿真的方法是编写一个插件。...插件机制允许回调机制、自定义Lua函数注册,当然也允许访问外部函数库。插件通常与子脚本一起使用(例如,插件注册自定义Lua函数,当从子脚本调用该函数时,将回调特定的插件函数)。...例如,在controlledViaB0RemoteApi.ttt中链接到机器人的子脚本主要任务如下: 用一些对象句柄作为参数启动控制器应用程序(bubbleRobClient_b0RemoteApi)。...(bubbleRobServer) 本地连接到控制器应用程序 在每次模拟过程中,将传感器值发送给控制器,并从控制器中读取所需的电机值 在每个模拟过程中,将所需的电机值应用到机器人的关节上 运行模拟...,并复制和粘贴机器人:将看到复制的机器人将直接运行,因为它们所附加的子脚本负责启动各自外部应用程序的新实例,或调用适当的插件函数。

    74510

    史上最详细的iOS之事件的传递和响应机制-实践篇

    例如,点击的是A视图,却要让B视图处理事件;点击子视图,却要让父视图处理事件等等。今天,我整理了下之前的杂记,罗列出了一些开发中可能遇到的情景和应对措施!...视图层次 如上图,视图层次结构:白色->红色->绿色。红色的view是绿色view的父视图,白色的view又是红色view的父视图。...原因在于,系统从window向下寻找最合适的view时候,遍历到红色的view时候,发现点不在红色的view上,那么默认控制器的view就是最合适的view。即控制器的view响应了事件。...分析:事件的响应是顺着响应者链条向上传递的,即从子控件传递给父控件,touch方法默认不处理事件,而是把事件顺着响应者链条传递给上一个响应者。这样我们就可以依托这个原理,让一个事件多个控件响应。...greenView %s",__func__); // 重写touch方法,自己可以响应事件 [super touchesBegan:touches withEvent:event]; // 在调用系统默认的方法

    8.5K20

    视图view类-源码解析

    视图类view主要用于页面内容的输出,模板调用等,用在控制器类中,可以使得控制器类把表现和数据结合起来。下面我们来看一下执行流程。...首先,在控制器类中保持着一个view类的对象实例,只要继承自控制器父类的类都可以使用这个实例,所以我们在控制器子类中就可以使用view类实例去很容易的调用模板,输出内容。...config); //实例化视图类 //控制器初始化 if(method_exists($this,'_initialize')) $this->_initialize(); } 我们在控制器类中输出模板和内容主要调用控制器类中的...Hook::listen('view_end'); } 我们可以看到在display方法中也是分别调用多个函数来协作完成模板处理工作的。...所以我们知道,对于视图类来说,大概分为以下几步,第一是根据参数去侦测出模板文件的地址,然后调用模板引擎去编译模板文件,形成编译缓存php文件,然后执行php文件返回内容。

    66010

    ThinkPHP一些默认规则

    _当前操作.html 和 当前模块/默认视图目录/当前主题/当前控制器_当前操作.html。...使用D函数实例化模型类,一般需要对应一个模型类 13. 模版表达式:模块@主题/控制器/操作  默认都是在view文件夹下 14....Common模块和普通模块一样,可以添加控制器、模型和视图,并且支持多层,但不能直接访问,只能继承,其中模型层可以作为公用模型,在D方法实例化中调用。...回复 @thinkphp : 你的意思是common模块里的控制器、模型和视图有两个作用:1当前模块里的php文件不存在的时候,自动去找公共模块中的同名文件 2.其他模块里的控制器、模型和视图 继承公共模块里的控制器...但Common模块本身不能通过URL直接访问,公共模块的其他文件则可以被其他模块继承或者调用

    80510

    Angular企业级开发(7)-MVC之控制器

    1.MVC中的控制器 AngularJS的控制器主要为了把模型和视图连接在一起。大多数业务逻辑操作都会放在视图对应的控制器中。...涉及到多个控制器中使用的业务逻辑,需要放到一个公共的服务中,然后把改服务注入使用到该业务逻辑的控制器中。 2.理解控制器 在AngularJS的控制器中,构造函数会有$scope参数。...当一个控制器通过ng-controller指令连接到DOM上,Angular将实例化一个新的控制器对象,然后调用指定的控制器的构造函数。...一个新的子作用范围(scope)将被创建,并作为一种可注入的参数传递给控制器​​的构造函数为$scope。...4.1 视图中控制器并列 各个控制器从附加DOM元素节点开始,到节点对应闭合标签结束的地方创建了一个子控制域,单个控制器里面的$scope对象只能访问和调用该控制器范围内的属性和方法。

    1.9K50

    CI基础知识笔记

    4.载入视图 $this->load->view(‘name’);//可以载入views目录下后缀是.php的视图文件,一个控制器可以载入多个视图 $this->load->view(‘folder...下,一旦使用$this->load->helper(‘name’);载入那么在视图和控制器当中都可以使用 可以是载入多个辅助函数$this->load->helper(array(‘help1′,’help2...没有执行路由或者其他过程 pre_controller调用你的任何控制器之前调用,此时所用的基础类路由选择和安全性检查都已经完成 post_controller_constructor在控制器实例化之后任何方法调用之前调用...函数 post_system最终渲染页面发送到浏览器之后,浏览器接受完最终数据的系统执行末尾调用 10.公共函数 ci使用了一些全局定义的函数,在任何情况下都可以使用 is_php(‘5.2.0’...,只需要在第一个视图传入数据就可以 9.辅助函数中的函数名最好做好命名规范,如果同时加载多个辅助函数文件,且其中有名称相同的函数,会导致 CI 出现空白页问题(也就是 PHP 语法错误)。

    1.3K30

    用纯 JavaScript 撸一个 MVC 框架

    设置事件监听器 现在我们有了这三个 handler ,但控制器仍然不知道应该什么时候调用它们。必须把事件侦听器放在视图中的 DOM 元素上。...在 Controller 的 constructor 中,调用 bindEvents 并传递控制器的this 上下文。 在所有句柄事件上都用了箭头函数。...这允许我们可以用控制器的 this 上下文从视图中调用它们。如果不用箭头函数,我们将不得不手动去绑定它们,如 controller.handleAddTodo.bind(this)。...响应模型中的回调 我们还遗漏了一些东西:事件正在侦听,handler 被调用,但是没有任何反应。这是因为模型不知道视图应该更新,并且不知道如何更新视图。...我们也不想每输入一个字母时都调用editTodo,因为它会重新渲染整个待办事项列表UI。 我决定在控制器上创建一个方法,用新的编辑值更新临时状态变量,另一个方法调用模型中的editTodo方法。

    3.3K41

    在WPS里面A1和B1为合并标题项目,A2与A3为合并编码项,B2与B3为单独项目,分解为4列

    一、CDR排版合并打印的数据需要列我们知道在CDR排版中,如果需要使用合并打印功能,则需要将数据改成列,这样在调用中才不会出错,本次客户发的表格数据如下:我们需要的数据如下:二、表格公式转换如何将客户发的表格数据转换为我们需要的表格数据...,本次我使用到的函数公式为:=INDEX(A:B,ROW()*3-{5,4,4,3},{1,1,2,2})  三、公式解读这个公式是WPS中的INDEX函数与ROW函数、乘法、减法、大括号等其他函数的组合使用...ROW()函数返回当前行的行号,乘以3表示在原来的行号上增加3倍。减去{5,4,4,3}这个序列表示在增加的行号上减去不同的数值,得到新的行号序列。...2、点击【文件】菜单选项,从列表选项中找到【合并打印】选项,再从子列表中点击【创建新文本】选项。3、点击【下一步】进入到“添加域”窗口页面,我们可以在选项框中添加文档日期,题目等需要编辑的内容。...5、找到并点击【视图】选项,选择页面排序器视图,这样设置可以方便我们审阅全部文档内容。6、最后在窗口中点击【执行合并打印】选项,即可进行批量文档合并打印处理。

    27310

    手把手教你读懂源码,View的绘制流程详细剖析

    ,这时候函数也需要重新测量当前视图的宽度和高度。...分析onMeasure方法,我们先从子类DecorView的onMeasure方法入手,这个方法主要是调整了两个入参高度和宽度,然后调用其父类的onMeasure方法。 ?...经过上述两步检查之后,FrameLayout类的成员函数onMeasure就得到了当前视图的宽度maxWidth和高度maxHeight。...ViewGroup的dispatchDraw方法 首先判断当前ViewGroup容器是否设置的布局动画,然后遍历给每个子视图View设置动画效果,接着获得布局动画的控制器,最后开始布局动画。...调用drawChild方法 接下来循环遍历每一个子View,并调用drawChild方法绘制当前视图的子视图View: ?

    1.3K100

    【Spring学习】过滤器和拦截器

    init():该方法在容器启动初始化过滤器时被调用,它在Filter的整个生命周期只会被调用一次,这个方法必须执行成功,否则过滤器会不起作用。...1.4、SpringBoot实现一个简单的过滤器 (1)首先随便写一个控制器Controller @RestController @Slf4j @RequestMapping("/api/filter"...会在Controller 中的方法调用之后,DispatcherServlet 返回渲染视图之前被调用。...,但是在视图被渲染之前(Controller方法调用之后),如果异常发生,则该方法不会被调用"); } @Override public void afterCompletion...不同点: ①:拦截器是基于java的反射机制(动态代理)的实现,而过滤器是基于函数的回调。 ②:拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。

    77121
    领券