Swift 无法通过委托调用协议方法

2023-12-08

我有两节课。一个类被命名为ViewController另一个类名为TabView.

我的目标是调用一个函数changeTab()它位于 ViewController 的 TabView 类内部。

不知怎的,我遇到了麻烦,因为每次我的代表nil.

这是我的 ViewController 代码:

protocol TabViewProtocol: class {
    func changeTab() 
}

class ViewController: NSViewController {
    // delegate
    weak var delegateCustom : TabViewProtocol?

    override func viewDidLoad() {
        print(delegateCustom) // outputs "nil"
    }

    buttonClickFunction() {
        print(delegateCustom) // outputs "nil"
        delegateCustom?.changeTab() // doesn't work
    }
}

这是我的 TabView 代码:

class TabView: NSTabViewController, TabViewProtocol {

    let myVC = ViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        myVC.delegateCustom = self
    }

    func changeTab() {
        print("test succeed")
    }
}

有人可以解释我做错了什么吗? - 我对代表和协议不熟悉...


您错误地使用了委托模式。很难判断您想要为哪个控制器定义协议以及您想要采用它 - 但这里是一种可能的方法。

// 1. Define your protocol in the same class file as delegate property.
protocol TabViewProtocol: class {
    func changeTab() 
}

// 2. Define your delegate property
class ViewController: NSViewController {
    // delegate
    weak var delegateCustom : TabViewProtocol?

    override func viewDidLoad() {
        // It should be nil as you have not set the delegate yet.
        print(delegateCustom) // outputs "nil"
    }

    func buttonClickFunction() {
        print(delegateCustom) // outputs "nil"
        delegateCustom?.changeTab() // doesn't work
    }
}

// 3. In the class that will use the protocol add it to the class definition statement

class TabView: NSTabViewController, TabViewProtocol {

    let myVC = ViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        myVC.delegateCustom = self

        // Should output a value now
        print(myVC.delegateCustom) // outputs "self"
    }

    func changeTab() {
        print("test succeed")
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 无法通过委托调用协议方法 的相关文章

  • 是否可以?相机 API ios [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在应用程序中实现一项功能 当用户
  • 从 Google/Facebook 帐户重新验证用户身份

    因此 我需要创建一个 REST API 来为 IOS 应用程序提供功能 我们允许用户仅使用普通帐户或使用脸书 谷歌登录 我最近一直在阅读 OAuth 我想我了解在我的情况下如何使用 OAuth 的过程 当用户使用脸书 谷歌登录 在我的应用程
  • 在 Alamofire 中快速发送 GET 请求中的 json 对象

    我正在尝试执行一个绑定了 json 对象的 GET 请求 这就是我生成 JSON 对象的方式 let jsonObject String AnyObject ean code type match value 16743799 然后我执行了
  • 如何在 C# 中从字符串调用委托?

    是否可以通过变量名称 作为字符串 调用存储在变量中的委托 我想我必须使用反射机制 但我没有得到任何结果 示例代码 class Demo public delegate int DemoDelegate private static int
  • 平板电脑在第一次单击时悬停,在第二次单击时单击

    发布这个问题主要是希望证实我对该行为的怀疑 从而为其他程序员记录下来 因为我在网上没有找到任何记录 我正在构建一个网站 其导航栏具有以下属性 水平截面是 ul of li 和一些 li li s 两者都有 A n a 元素带您进入该主题 触
  • 使 Swift 类符合需要 init 的协议

    我有以下内容protocol in Swift protocol FooConvertible typealias FooType init foo FooType 我会做Swift类在类定义中符合它 class Bar FooConver
  • 快速将数据从 tableviewcontroller 传递到另一个 tableviewcontroller

    我有一个正在创建的表单 该表单填充有用户输入的文本字段 回答完所有问题后 会弹出一个保存按钮 我在使此表视图控制器将数据传递到新的表视图控制器时遇到问题 我被困住了 不知道该怎么做 import UIKit class TableViewC
  • iOS 新手。预期的表达错误?

    这看起来很不寻常 因为该方法与我的 showAnswer 方法完全相同 所以我想我应该在这里问 import QuizViewController h interface QuizViewController end implementat
  • npm 不起作用,总是出现此错误 -> 错误:找不到模块 'are-we-there-yet'

    我尝试在 Mac 上使用 Yosemite 安装 grunt 节点已经安装在最新版本中 如果我在终端中输入 node v 我会得到 v0 12 5 行 那挺好的 但是当我想用 npm 安装某些东西时 我只得到一个错误 我尝试了 sudo n
  • 让约束在尺寸类别中发挥作用

    所以 我正在 Xcode 6 beta 中尝试尺寸类 我对图像设置了一些限制 使其根据 iPhone 纵向和横向对应的尺寸类别处于不同的位置 这些限制在下图中可见 正如您所看到的 当我处于紧凑 紧凑状态时 一些约束被 安装 而其他约束则没有
  • 我可以使用 NSDateFormatter 将此日期字符串转换为 NSDate 吗?

    我有这个字符串 2010 08 24T16 00 00 05 00 我想从中提取时间部分 即 16 00 并将其转换为 12 小时等效值 即下午 04 00 我正在尝试使用 NSDateFormatter 来完成此任务 但它不起作用 NSD
  • 将 HTML 字符串加载到 UIWebView 中的延迟

    我在导航控制器中有两个视图控制器 第一个视图控制器有一个带有按钮的菜单 按下此按钮将移动到第二个视图控制器并将 html 字符串加载到 UIWebView 中 没有其他东西被加载到 webview 中 只是一个简单的 NSString 其中
  • 包含字符串和数字的数组

    在 Objective C 中 很容易创建一个异构数组 如下所示 NSArray myArray String1 String2 123 456 有什么方法可以快速创建这样的数组吗 如果是的话怎么办 Note 我在 swift 中尝试了类似
  • iPhone / iPad IOS 应用程序仪器内存计数与 task_info 内存计数

    我一直在使用 Instruments Leak Tester 它给出了大约 1 3 meg 的应用程序总分配数字 但是 当使用 task info 时 它会报告更大的内存量 例如 10 20 meg 我想我只是想确认task info正在返
  • 连接到 Apple Music

    所以我尝试使用 React Native 应用程序从 iOS 设备连接到 Apple Music 有一个 API 可以执行相同的操作 但我需要从 storekit 框架调用一个函数 提出个性化请求 苹果音乐API https develop
  • Xcode 本地化设置中没有加号或减号按钮

    我需要在两天内翻译 iOS 应用程序 但我的 XCode 版本 4 4 和 4 5 Developer Preview 都没有给我添加其他语言的选项 我只能选择单击 Make localized 但我只能选择英语 选择它后 Xcode 中的
  • 即时将图像添加到 AR 资源以进行图像识别

    ARKit1 5介绍图像识别 在代码中 您必须创建一组参考图像 如下所示 let referenceImages ARReferenceImage referenceImages inGroupNamed AR Resources bund
  • AVAudioMixerNode pan 或 AVAudioUnitSamplerstereoPan 属性无法更改 AVAudioEngine 声音输出的左/右平衡

    我有以下代码 它播放单个 MIDI 音符 但我希望能够调整平衡 平移 以便它仅从左扬声器或右扬声器或某些组合中播放 我认为更改 sampler stereoPan 或 engine mainMixerNode pan 也许可以解决问题 但它
  • 使用 NSOutlineView 作为文件系统目录浏览器的 Swift 代码

    我已经在这段 Swift 代码上苦苦挣扎了一段时间 但没有发现问题 代码 下面应该提供文件目录作为 NSOutlineView 的数据源 GUI 非常简单 只是一个带有 NSOutlineView 和 OutlineViewControll
  • 更新查询时 ios 中出现“数据库锁定”错误

    我正在使用下面的代码更新查询 using sqlite 但我越来越 database is locked error 我尝试搜索一些 SO 链接 建议关闭数据库 但我再次执行此操作时遇到相同的错误 我已经提到过代码中出现错误的地方 cons

随机推荐

  • JSP 单选按钮值

    我想知道如何获取单选按钮的值 假设我有一个带有两个单选按钮的表单 我想获取与按钮关联的值 但是 当我尝试这样做时 我得到了 null 表格部分
  • js函数从url获取文件名

    我有一个像这样的网址http www example com blah th html 我需要一个 javascript 函数来给我其中的 th 值 我的所有网址都具有相同的格式 2 个字母的文件名 扩展名为 html 我希望它是一个安全的
  • VBA - 比较 2 张纸上的表格的差异

    我是 VBA 新手 正在寻求编写子程序或代码的帮助 该子程序或代码可以比较 2 个不同工作表上两个表的同一列 B 并将它们合并到第一个工作表上的单个表中 我已经研究过如何做到这一点 并且对于使用范围或联合作为解决方案感到非常困惑 我希望它找
  • 必须声明标量变量

    当我尝试在应用程序中执行以下非查询 sql 命令时 我总是收到错误消息 必须声明标量变量 RateID 我有点不明白为什么会收到这个错误 这是我的代码 string sqlText INSERT INTO tblRates RateID I
  • 如何使用delphi 2010 rtti设置数组长度

    如何在运行时设置数组长度 setLength t GetProperty 属性 3 unit Unit3 interface uses Windows Messages SysUtils Variants Classes Graphics
  • 订购 Pyspark Window 时缺少数据

    这是我当前的数据集 from pyspark sql import Window import pyspark sql functions as psf df spark createDataFrame 2 1 1 3 2 2 schema
  • next() 和 list() 中的每一个都以不同的方式迭代具有可变对象的生成器

    def generator dct for i in range 3 dct a i yield dct g generator a None next g gt a 0 next g gt a 1 next g gt a 2 g gene
  • 如何从 BeautifulSoup get text 方法中去除换行符

    抓取网页后我有以下输出 text Out 50 nAbsolute FreeBSD 2nd Edition n nAbsolute OpenBSD 2nd Edition n nAndroid Security Internals n nA
  • 如何使用 MVVM 从 BackgroundWorker 内部更新 ObservableCollection?

    这两天我正在尝试解决以下问题 我有一个 WPF 控件 其中 WrapPanel 绑定到 ObservableCollection 操作会更改 ObservableCollection 的内容 内容加载到BackgroundWorker 中
  • 用于升级外部主板的 Android 应用程序

    背景 我们创建了一个 Android 应用程序 目前通过蓝牙连接与外部主板进行通信 该板依次发出命令以不同的速度运行一个或多个电机 该应用程序是为海洋行业的特定任务而构建的 我们的目标是增强该应用程序 以便 Android 移动用户 将来
  • 在 Windows 上的 Matlab 中使用 getframe

    I used the code which I asked about here but added in the final loop the ani ii getframe and after the loop movie2avi an
  • 致命错误 LNK1158:无法运行“mt.exe”

    我知道问题编译 VS 2012 C 项目时出现致命错误 无法运行 mt exe 但我对那里的答案不满意 我将我的 Visual Studio 项目从 VS2010 转换为 VS2012 但是当我编译我的解决方案时 我收到 致命错误 LNK1
  • 编写C#插件系统

    我正在尝试编写一个插件系统 为我的应用程序提供一些可扩展性 以便有人可以为该应用程序编写插件 而无需触及主应用程序的代码 并有破坏某些内容的风险 我已经编写了基本的 IPlugin 接口 atm 尚未实现任何内容 这是我的加载方式 publ
  • 如何在上传文件时添加进度条

    我正在将文件传输到网址 我可以成功完成 但我不知道如何获取已上传文件的进度 我需要获取某些数字的进度 fileTransfer upload file path api endpoint options data then data gt
  • 捕获没有文本框的键盘输入

    我有一个应用程序 可以从健康卡中读取数据并解析它们以获取出生日期 健康卡 和姓名等基本信息 现在 我有一个文本框 可以从刷卡器中获取输入 效果很好 但我觉得可能有更好的方法 我希望在应用程序的后台有一个键盘侦听器 它可以捕获刷卡器的输入并解
  • Crystal Reports - 计数公式

    我正在 Crystal 中开发一份报告 我需要对具有几种不同状态的特定字段进行计数 例如 我的报告中有一个 StatusType 字段 其中包含的值是 In Process Rejected On Hold or Submitted 我希望
  • 如何检查是否给出了参数?

    Checks if an argument was specified if argv 1 strcpy Buff1 argv 1 else strcpy Buff1 default 如果我运行 program test 增益1 测试 如果
  • Epson epos sdk收据对齐问题

    我目前正在使用适用于 Android 的 epson ePOS SDK 我需要打印收据 菜单名称在同一行中左对齐 价格右对齐 但它无法正常工作 我的临时解决方案是添加一些提要行以使其价格正确对齐 是否可以使文本在同一行中左右对齐 以下附件
  • RecyclerView 中的 Admob 原生广告 [重复]

    这个问题在这里已经有答案了 我想在我的一个具有 recyclerview 的报价应用程序中实施 admob 原生广告 我正在学习 android 编程 并试图找到原生广告的教程 但没有任何好的教程可用于在 recyclerview 中实现原
  • Swift 无法通过委托调用协议方法

    我有两节课 一个类被命名为ViewController另一个类名为TabView 我的目标是调用一个函数changeTab 它位于 ViewController 的 TabView 类内部 不知怎的 我遇到了麻烦 因为每次我的代表nil 这