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

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

97540
  • Swift基础语法(三)

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

    2K40

    Swift学习:协议

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

    48320

    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.4K20

    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

    90930

    Swift基础 协议

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

    15000

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

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

    52040

    【译】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属性。

    44620

    代理设计模式

    官方给出定义 为其他对象提供一种代理以控制对这个对象访问 通俗讲一个例子,同学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

    16910

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

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

    1K90

    不惧面试:委托

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

    819141

    编程小知识之协变和逆变

    本文简述了 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

    93030

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

    { void func() { //访问不到私有成员 //到了Son3m_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

    Swift 5.6到5.10新特性整理

    如果你采取了一些措施来规避 Swift 并发 actor 和 Sendability(例如,因为你正在处理使用 Semaphore或 DispatchQueue 来同步访问遗留代码),你可以通过将全局变量标记为...例如,TableView.Delegate 自然是与表视图相关委托协议。...read() { print(message) } } 这将消息本身标记为私有,因此只能通过调用消耗实例 read() 方法来访问它。...如果你在另一个结构体或枚举中使用不可复制类型作为属性,则该结构体或枚举也必须是不可复制。 你需要非常小心地从现有类型添加或删除 `Copyable,因为它会显著改变它们使用方式。...(numbers[0], numbers[1])) Swift 无法在静态验证(即在编译时)确定这两个值是否可以使用 ==进行比较,因此代码根本无法构建。

    2K11
    领券