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

无法通过委托/协议访问父VC中的func()

无法通过委托/协议访问父VC中的func()是指在iOS开发中,无法通过委托或协议的方式直接访问父视图控制器(ViewController)中的某个函数(func)。

在iOS开发中,委托和协议是常用的设计模式,用于实现视图控制器之间的通信和数据传递。通过委托和协议,可以定义一组方法,然后在子视图控制器中实现这些方法,以便与父视图控制器进行交互。

然而,委托和协议的作用范围仅限于当前视图控制器与其委托或遵循协议的对象之间的通信。无法直接通过委托或协议访问父视图控制器中的函数。

解决这个问题的一种常见方法是使用闭包(Closure)。通过在子视图控制器中定义一个闭包属性,并在父视图控制器中设置该闭包的实现,可以实现子视图控制器向父视图控制器传递消息或调用特定的函数。

以下是一个示例代码:

在父视图控制器中:

代码语言:txt
复制
class ParentViewController: UIViewController {
    var closure: (() -> Void)?
    
    func parentFunc() {
        // 父视图控制器中的函数逻辑
    }
    
    func presentChildViewController() {
        let childVC = ChildViewController()
        childVC.closure = { [weak self] in
            self?.parentFunc()
        }
        present(childVC, animated: true, completion: nil)
    }
}

在子视图控制器中:

代码语言:txt
复制
class ChildViewController: UIViewController {
    var closure: (() -> Void)?
    
    func childFunc() {
        // 子视图控制器中的函数逻辑
        
        // 调用父视图控制器中的函数
        closure?()
    }
}

在上述示例中,通过在父视图控制器中设置闭包属性,并在子视图控制器中调用该闭包,实现了子视图控制器向父视图控制器传递消息或调用父视图控制器中的函数。

对于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体的云计算品牌商,无法给出具体的推荐链接。但腾讯云作为一家知名的云计算服务提供商,提供了丰富的云计算产品和解决方案,可以通过访问腾讯云官方网站获取相关信息。

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

相关·内容

iOS 面试策略之经验之谈-面向协议的编程

Objective-C 没有命名空间,所以很多类在命名时都加入了驼峰式的前缀。 扩展性。在 Swift 中,class 可以通过 extension 来进行增加新方法,通过动态特性亦可以增加新变量。...当然我们也可以引入一个专门的父类或工具类,但是依然有职权不明确、依赖、冗杂等多种问题。 另一方面,父类中的 handleSomething() 方法必须由具体实现,它不能根据子类做出灵活调整。...Swift 和 Objective-C 是不支持多继承的,因为这会造成菱形问题,即多个父类实现了同一个方法,子类无法判断继承哪个父类的情况。...]; // 能通过编译,但运行到ob时程序会崩溃 } // Swift中使用了POP let vc = ... let tvc = ... let ob = ......协议的命名(例如 Shakeable)直接可以确定其实现的 UIButton 拥有相应 shake 功能;通过协议扩展,可以针对不同类实现特定的方法,可维护性也大大提高;因为协议扩展通用于所有实现对象,

1.3K20

Swift进阶七——面向对象编程

我们知道,数组、字典等都是可以通过下标来访问里面的元素的。比如,数组可以通过Int类型的下标访问其中的某个元素,字典可以通过Key类型的下标访问到某个具体值。...两段式初始化中的安全检查 指定初始化器必须保证,在向上委托给父类初始化器之前,其所在类引入的所有属性都要初始化完成。 指定初始化器必须先向上委托父类初始化器,然后才能为继承的属性设置新值。...如果不这样做,指定初始化器赋予的新值将会被父类的初始化器所覆盖。 便捷初始化器必须先委托同类中的其他初始化器,然后再为任意属性(包括同类里定义的属性)赋新值。...此时,这些存储属性的内存被初始化了 指定初始化器向上委托给父类的初始化器,使父类为其存储属性执行相同的任务 这个调用父类初始化器的过程将沿着初始化器链一直向上进行,直到到达初始化器链的最顶部 一旦到达初始化器链的最顶部...除了协议列表,协议组合也能包含类类型,这允许你标明一个需要的父类。如下: ? 扩展与协议的结合 有条件地遵循协议 我们知道,可以通过扩展来给一个已经存在的类型遵循新的协议。

98440
  • Swift基础语法(三)

    在Swift中,我们可以通过属性观察者来监听和响应属性值的变化。...self属性 每一个类的实例都隐含一个名为self的属性,这个self指的是调用当前方法或者属性的实例对象,我们可以使用self来访问当前类中的属性和方法。...协议的继承 //父协议 protocol ParentProtocol { //属性 var name : String {get set} //方法 func...func study() } //遵循协议 class Student : SonProtocol { //实现父协议中的内容 var name: String = ""...,是通过关键字 associatedtype 来实现的 与类、结构体或者枚举中的泛型一样,协议中的泛型也可以进行类型约束(通过继承或者遵循协议的方式) 异常 如何来描述一个异常 在Swift中,任何一个遵从

    2.1K40

    iOS 代码规范

    break; } } 在Switch语句使用枚举类型的时候,如果使用了default分支,在将来就无法通过编译器来检查新增的枚举类型了。 函数 1....如果某些功能(方法)具备可复用性,我们就需要将它们抽取出来放入一个抽象接口文件中(在iOS中,抽象接口即协议),让不同类型的对象遵循这个协议,从而拥有相同的功能。...因为协议是不依赖于某个对象的,所以通过协议,我们可以解开两个对象之间的耦合。如何理解呢?...但是个别的时候,必须在头文件中引入其他类的头文件: 主要有两种情况: 该类继承于某个类,则应该引入父类的头文件。 该类遵从某个协议,则应该引入该协议的头文件。而且最好将协议单独放在一个头文件中。...因为并不是所有的键都遵从拷贝协议(字典的键是必须要支持拷贝协议的,有局限性)。 NSCache是线程安全的:不编写加锁代码的前提下,多个线程可以同时访问NSCache。

    2.4K20

    Swift学习:协议

    { //这里是结构体的定义部分 } 3.拥有父类的类在遵循协议时,需要将父类名放在协议名之前,以逗号分隔 class SomeClass: SomeSuperClass, SomeProtocol...委托是一种设计模式,它允许类或结构体将一些需要它们负责的功能委托给其他类型的实例。...委托模式的原理: 定义协议来封装那些需要被委托的功能,这样就能确保遵循协议的类型能提供这些功能。...同样道理,我们也可以通过扩展为已有类型实现需要遵循的协议,通过这种方法与在原始定义中遵循并实现协议效果完全相同。...4.协议中的可选要求可通过可选链式调用来使用,因为遵循协议的类型可能没有实现这些可选要求 下面的例子定义了一个名为Counter的用于整数计数的类,它使用外部的数据源来提供每次的增量。

    49220

    Swift基础语法简化版(续)

    var person = Person() 访问属性和方法 类属性方法的访问和结构体的属性方法的访问是一模一样的。 我们可以使用点语法来访问一个类的实例的属性和方法。...,那么可以通过final关键字来阻止子类的重写行为: //父类 class Person { var name = "norman" //通过final关键字阻止被重写 final...mutating func eat()} 协议的遵循 遵循协议的写法跟继承父类的写法其实是一样的: //协议 protocol SomeProtocol { //属性 var name...: SonProtocol { //实现父协议中的内容 var name: String = "" func play(company: String) {...,是通过关键字 associatedtype 来实现的 与类、结构体或者枚举中的泛型一样,协议中的泛型也可以进行类型约束(通过继承或者遵循协议的方式) 面向协议编程 众所周知,Swift是一门面向协议编程的语言

    1.6K20

    iOS-代码规范

    break; } } 在Switch语句使用枚举类型的时候,如果使用了default分支,在将来就无法通过编译器来检查新增的枚举类型了。 函数 ---- 1....---- 如果某些功能(方法)具备可复用性,我们就需要将它们抽取出来放入一个抽象接口文件中(在iOS中,抽象接口即协议),让不同类型的对象遵循这个协议,从而拥有相同的功能。...因为协议是不依赖于某个对象的,所以通过协议,我们可以解开两个对象之间的耦合。如何理解呢?...但是个别的时候,必须在头文件中引入其他类的头文件: 主要有两种情况: 该类继承于某个类,则应该引入父类的头文件。 该类遵从某个协议,则应该引入该协议的头文件。而且最好将协议单独放在一个头文件中。...因为并不是所有的键都遵从拷贝协议(字典的键是必须要支持拷贝协议的,有局限性)。 NSCache是线程安全的:不编写加锁代码的前提下,多个线程可以同时访问NSCache。

    2.2K20

    金三银四面试:C#.NET面试题中高级篇3,含答案解析

    6.在.NET中的委托是什么?委托是寻址的.NET版本。在C++中,函数指针只不过是一个指向内存位置的指针,它不是类型安全的。我们无法判断这个指针实际指向什么,像参数和返回类型等项久更无从知晓了。...访问修饰符可以是public/private/protected等。---->详解8 .NET默认的委托类型有哪几种?...例如Func委托类型可以调用带返回类型且无参数的方法,Func委托类型调用带有4个参数和一个返回类型的方法。---->详解 9.什么是泛型委托?...如果委托要通过C#的params关键字获取可变数量的额参数,要为委托的任何桉树指定默认值,或者要对委托的泛型类型参数进行约束,也必须定义自己的委托类型delegate void EventHandler...逆变:父类转换为子类;协变:子类转换为父类 ---->详解 10. 什么是匿名方法? 匿名方法是用作委托的参数的一段代码。

    1.9K30

    【笔记】C++面向对象高级编程

    父类写好一套算法流程, 但是其中调用的都是虚函数, 子类实现父类的函数后, 调用父类的算法流程, 父类由于本质上使用的是子类this指针, 因此会自动在流程中调用子类的实现....组件: 整个结构以多个不同派生但是基类相同的对象组成, 由于大家基类都相同所以可以互相嵌套 原型: 构造函数私有, 对外接口是clone, 通过clone某个委托了的原型对象来复制创建其它继承后的类..., 静态绑定是指非虚函数和不满足多态条件的虚函数调用, 在静态绑定中的情况下, 编译后的代码实际上直接调用call跳转到真正函数的地址进行执行 动态函数绑定需要满足三个条件: 通过指针进行调用, 指针是从子类上转型到父类的...我们应该将其理解为一种程序内的协议来看上面的图, 保证了元素不被改变的对象不能调用non-const函数 因此为了最大化使用范围, 我们应该尽可能编写const型函数, 防止看似无伤大雅的const对象无法调用所需函数...但是当对象不是const时, 访问数据的时候就需要拷贝一份然后返回引用以供外部安全修改了. new和delete new和delete本身是表达式, 其本身的行为是无法修改的: new: 先调用operator

    91530

    C#语法——委托,架构的血液

    本篇文章主要介绍委托的应用。 委托是大家最常见的语法了,但会用与精通之间的差别是巨大的。 一个程序员如果不能精通委托,那么,他永远无法成为高级程序员。 所以,让我们把委托刻到血液里吧。...匿名委托的应用 匿名委托的官方介绍:在 2.0 之前的 C# 版本中,声明委托的唯一方式是使用命名方法。 ...如上面代码所示,这里介绍了Action与Func的最基础的异步应用。 委托,架构的血液 委托是架构的血液,如果系统中没有委托,那代码将堆叠到一起,比大力胶粘的都紧密。...父类是干什么的呢?父类通常是用来编写公共属性和函数,方便子类调用的。 那我们的委托的第一个核心应用,就是父类的公共函数,线程随手启动。如何随手开启呢?...var res = action.EndInvoke(iar); callback(res); }, null); } } 我们看到上面的代码,父类中添加了四个异步委托的调用函数

    52540

    Swift基础 协议

    允许变量参数,但须遵守与正常方法相同的规则。然而,无法为协议定义中的方法参数指定默认值。 与类型属性要求一样,当在协议中定义static关键字时,您总是在类型方法要求前加上静态关键字。...这种设计模式是通过定义封装委托责任的协议来实现的,这样保证符合的类型(称为委托)可以提供已委托的功能。委托可用于响应特定操作,或从外部来源检索数据,而无需知道该源的基础类型。...将协议标记为仅类可以让SnakesAndLadders类在本章后面声明其委托必须使用弱引用。正如在仅类协议中讨论的那样,仅类协议通过从AnyObject继承来标记。...即使您无法访问现有类型的源代码,您也可以扩展现有类型以采用和遵守新协议。...在这里,increment(forCount:)可能无法实现的可能性也通过可选链处理。

    15800

    【译】Swift Delegation

    toc Delegation委托是Apple iOS开发中很常见的一种模式,不过在之前开发Hipo中更多算是照猫画虎,这次来一篇Apple iBooks中《The Swift Programming...该设计模式首先定义一个协议(protocol)描述被委托的责任,然后由受托者保证委托功能的实现。委托设计模式能够用来响应特定的动作或者从其他来源接受数据而不需要知道对方的类型。...作为一个只能用在类上的协议,下面例子中SnakesAndLadders类只能用弱引用来声明它的委托。...game的类型是DiceGame而不是SnakesandLadders,因此gameDidStart(_:)只能访问和使用DiceGame协议中的属性和方法。...gameDidStart(_:)方法中还访问了game参数的dice属性。因为game实现了DiceGame协议,因此就保证了一定有dice属性。

    45720

    不惧面试:委托

    ★☆ 本题主要考察委托的概念:委托是寻址的.NET版本。在C++中,函数指针只不过是一个指向内存位置的指针,它不是类型安全的。我们无法判断这个指针实际指向什么,像参数和返回类型等项久更无从知晓了。...访问修饰符可以是public/private/protected等 5..NET默认的委托类型有哪几种?★★ 1.Action   泛型Action委托表示引用一个void返回类型的方法。...i)   3.如果委托要通过C#的params关键字获取可变数量的额参数,要为委托的任何桉树指定默认值,     或者要对委托的泛型类型参数进行约束,也必须定义自己的委托类型     delegate...逆变:父类转换为子类;协变:子类转换为父类 9.什么事匿名方法★★ 匿名方法是用作委托的参数的一段代码。...★★ 通过Lambda表达式可以访问Lambda表达式块外部的变量,这成为闭包。 当引用外部变量时,需要注意,外部变量变化时,lambda表达式的结果也可能会随着外部变量变化而变化。

    824141

    Protocol与Delegate 使用方法详解你要知道的KVC、KVO、Delegate、Notification都在这里

    Java的接口,规定一系列实现类应该遵守的方法,OC中protocol协议远没有Java中的interface使用频率高,毕竟在Java中面向接口编程更加盛行,但OC使用较频繁的代理模式delegate...,扩展的是NSObject类,接着定义了Bird类,该类继承自NSObject类,因此也继承了fly方法,在Bird类的实现中实现了fly方法,因此在main函数中可以通过NSObject来调用fly方法...Java的类一样,不支持多重继承,只支持单继承,OC的协议protocol与Java的interface接口一样,支持多重继承,在定义protocol协议时最好让其继承NSObject协议,否则无法使用...,当需要给委托的对象传递信息或是想要从委托对象获取信息时就可以调用相关的方法,通过从委托获取数据这样的方式可以将数据与业务逻辑解耦,就像我们常使用的UITableView或UICollectionView...还有一种是数据源dataSource,对象需要从委托对象中获取数据,此时在代理协议中声明的方法就会有返回值,有时也会传递一定的形参通知委托对象返回什么样的数据。数据流向如下图所示: ?

    1K90

    代理设计模式

    官方给出的定义 为其他对象提供一种代理以控制对这个对象的访问 通俗讲一个例子,同学A给同学B送东西,但是同学A临时有事去不了,这时同学A需要找了另外同学C帮他去送东西,我们就说C是A的代理,送东西这件事就是他们之间的协议...组成部分: 1、协议:用来指定代理双方要做什么事情(送东西) 2、代理:根据指定的协议,完成协议规定的事情(同学C) 3、委托:根据指定的协议,指定代理去完成的事情(同学A) 具体代理模式的实现...) 一般情况下协议中的方法会将触发协议的对象传递出去(studentA) #import @class StudentA; @protocol StudentAProtocol...,在委托类(同学A)设置代理对象(同学C)后,实际上只是用一个id类型的指针将代理对象(同学C)进行了一个弱引用,委托类(同学A)让代理(同学C)执行协议,实际上就是在委托类(同学A)中向这个id类型指针指向的对象发送消息...个assign,通过这俩种关键字修饰的指针变量,都不会改变被引用对象的引用计数,但是一个对象被释放后,weak会自动指向nil,而assign则不会,在iOS中,向nil发消息时不会导致崩溃,而assign

    17510

    编程小知识之协变和逆变

    本文简述了 C# 中协变和逆变的一些知识 在 C# 中, 协变 和 逆变 能够实现 数组类型 和 委托类型 的隐式引用转换, .NET Framework 4 (包括)以后, C# 也开始支持在...> d2 = d1; object o = d2(); 上面代码中的函数 Func, 正常应该对应于委托 CovarianceDelegate,但是因为我们使用了协变(),...所以类型参数间只要构成 子类(示例中是 string)转父类(示例中是 object) 关系时便可以正确进行隐式引用转换,所以示例中将 d1(CovarianceDelegate) 赋值于...,"似乎"上面的代码没有什么问题,但实际上这两行代码并不能通过编译,原因我们可以通过下面的代码来进行理解(示例代码的前提是 Delegate2 支持逆变): public static void Func1...> d2 = d1; d2(Func2); d1 是委托 Delegate2, 其接受一个 Delegate1 类型的参数, d2 是委托 Delegate2<string

    94030

    【C++】C++核心编程部分-内存分区模型-引用-函数提高-类与对象-文件操作

    { void func() { //访问不到父类的私有成员 //到了Son3中m_A,m_B,m_C全是私有成员,子类无法访问 } }; int main(void) { system...继承同名成员处理方式 问题:当子类与父类出现同名的成员。如何通过子类对象,访问到子类或父类中同名的数据呢?...<<son.m_A<< endl; //如果要通过子类对象访问到父类中的同名成员,需要加作用域。.../通过类名访问 cout 通过类名访问" << endl; cout << Son::m_A << endl; //第一个::代表通过类名方式访问,第二个::代表访问父类作用域下 cout...; son2.func(); son2.Base::func(); //通过类名访问 cout 通过类名访问" << endl; Son::func(); Son::Base::

    1.9K00

    c#4.0中的不变(invariant)、协变(covariant)、逆变(contravariant)小记

    ' to 'System.Func'  即:无法隐式将System.Func转换成System.Func 说得更白一点,4.0以前的泛型委托,泛型参数一旦在实例使用过程中明确为具体类型后...而在4.0中,上面的代码可正常编译运行,如果研究下4.0中Func中的原型,会发现多了二个关键字: public delegate TResult Func(T arg...这样编译器就能自动将T隐式转化为T的子类,而返回类型TResult也能自动隐式转化为它的父类。...说穿了就是OOP中的一个常理:子类与父类的继承关系,其实就是is a的关系,所以任何能用父类做为输入参数的地方,当然也能用子类作为替换(子承父业);而任何返回子类的地方,当然也能安全的向上转行为父类.

    868100
    领券