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

MDC崩溃,返回'NSInvalidArgumentException',原因:'-[UIButton applyOutlinedThemeWithScheme:]:无法识别的选择器已发送到实例

基础概念

MDC(Material Design Components) 是一套遵循 Material Design 设计规范的 UI 组件库,用于构建现代化的移动应用界面。它提供了丰富的组件和主题支持,使得开发者可以轻松实现一致且美观的用户界面。

NSInvalidArgumentException 是 Objective-C 中的一种异常类型,表示向对象发送了一个它无法识别的消息(即选择器)。这通常是由于调用了一个不存在的方法或属性引起的。

原因分析

错误信息 -[UIButton applyOutlinedThemeWithScheme:]:无法识别的选择器已发送到实例 表明在尝试调用 applyOutlinedThemeWithScheme: 方法时,UIButton 实例无法识别该方法。可能的原因包括:

  1. 方法不存在applyOutlinedThemeWithScheme: 方法可能在当前的 MDC 版本中已被移除或重命名。
  2. 库版本不匹配:项目中使用的 MDC 库版本与代码中引用的方法不兼容。
  3. 链接错误:可能是因为库没有正确链接到项目中,或者存在多个版本的 MDC 库导致冲突。

解决方案

1. 检查 MDC 版本

首先,确认项目中使用的 MDC 库版本。可以在 Podfilepackage.json 中查看:

代码语言:txt
复制
# Podfile 示例
pod 'MaterialComponents'

确保版本是最新的,或者与代码中引用的方法兼容。

2. 更新代码

如果 applyOutlinedThemeWithScheme: 方法已被移除,需要查找替代方法或更新代码。可以参考 MDC 的官方文档或 GitHub 仓库中的更新日志。

例如,假设该方法已被重命名为 applyOutlinedTheme,则应更新代码如下:

代码语言:txt
复制
[button applyOutlinedTheme];

3. 清理和重建项目

有时,缓存问题可能导致链接错误。尝试清理项目并重新构建:

代码语言:txt
复制
# 对于 Xcode 项目
xcodebuild clean
xcodebuild build

或者使用 CocoaPods:

代码语言:txt
复制
pod install

4. 检查库链接

确保 MDC 库已正确链接到项目中。可以在 Xcode 中查看项目的 "Build Phases" -> "Link Binary With Libraries" 部分,确认 MaterialComponents.framework 或相关库已添加。

示例代码

假设 applyOutlinedThemeWithScheme: 方法已被重命名为 applyOutlinedTheme,以下是更新后的示例代码:

代码语言:txt
复制
#import <MaterialComponents/MaterialButtons.h>

// 创建 UIButton 实例
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];

// 应用主题
[button applyOutlinedTheme];

应用场景

MDC 的按钮主题方法通常用于自定义按钮的外观,以符合 Material Design 规范。这在构建需要统一视觉风格的应用时非常有用,特别是在移动应用开发中。

通过以上步骤,应该能够解决 NSInvalidArgumentException 异常,并确保按钮主题正确应用。

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

相关·内容

iOS APP运行时Crash自动修复系统

“小王啊,刚刚上线的X.X.X版本出问题了啊,怎么样操作会crash啊,导致新功能都无法使用了,快定位一下是什么原因,抓紧hotpatch修复一下啊!”。...,再将crash的具体信息提取出来,实时返回给用户。...performSelector:@selector(someMethod:)]; 结果肯定会导致app的崩溃,因为testObj是一个UIButton对象,而UIButton并没有实现 someMethod...但是通过我们的crash防护系统,调用这段代码时app并不会崩溃,同时XCode的Console如下: [image] 可见对应的crash的信息(crash类型,原因,调用栈信息)均可以完整的打印在XCode...通过重写NSObject的forwardingTargetForSelector方法,我们就可以将无法识别的方法进行拦截并且将消息转发到安全的桩类对象中,从而可以使app继续正常运行。

3.4K1713
  • 安卓 topic-意图 Intent

    使用隐式 Intent 启动服务存在安全隐患,因为您无法确定哪些服务将响应 Intent,且用户无法看到哪些服务已启动。...如果出现这种情况,则调用将会失败,且应用会崩溃。要验证 Activity 是否会接收 Intent,请对 Intent 对象调用 resolveActivity()。...但是,如果多个应用可以响应 Intent,且用户可能希望每次使用不同的应用,则应采用显式方式显示选择器对话框。 选择器对话框每次都会要求用户选择用于操作的应用(用户无法为该操作选择默认应用)。...例如: 选择器对话框。...例如,主页应用通过使用指定ACTION_MAIN 操作和 CATEGORY_LAUNCHER 类别的 Intent 过滤器查找所有 Activity,以此填充应用启动器。

    1.3K10

    iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API不兼容奔溃,模拟多继承)

    选择器:表示消息或方法名称的一种特殊方式,表示为类型SEL。选择器本质上就是不透明的字符串,它们被管理,因此可以使用简单的指针相等来比较它们,从而提高速度。...原因是这种技术主要是为了让对象让其他对象为他们处理 消息,从而 “转发”。 消息转发是一种功能强大的技术,可以大大增加Objective-C的表现力。什么是消息转发?...换句话说,无论何时发送未知消息,它​​都会以一个很好的包发送到您的代码中,此时您可以随心所欲地执行任何操作。 1.3 OC的方法本质 OC中的方法默认被隐藏了两个参数:self和_cmd。...当一个对象由于没有相应的方法实现而无法响应某个消息时,运行时系统将通过forwardInvocation:消息通知该对象。...button,未实现其方法 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame =

    2.1K11

    iOS工程师必看的 20 道 面试题

    原因是assign修饰的对象被释放后,指针的地址依然存在,造成野指针,在堆上容易造成崩溃。而栈上的内存系统会自动处理,不会造成野指针。 copy与strong类似。...原因在于滑动时当前线程的runloop切换了mode用于列表滑动,导致timer暂停。...struct也有这样几个优势: 结构较小,适用于复制操作,相比于一个class的实例被多次引用更加安全。...反之,低级别的变量却可以定义在高级别的变量中。比如 public 的 class 中可以含有 private 的 Int。 Open 具备最高的访问权限。...实现一个自定义的UIButton类,在其中添加点击抖动效果的方法(shake方法) 写一个UIButton或者UIView的拓展(extension),然后在其中增加shake方法 定义一个protocol

    3.8K40

    Network 之二 Ethernet(以太网)中的 MAC、MII、PHY 详解

    考虑到芯片面积及模拟/数字混合架构的原因,通常,将 MAC 集成进微控制器而将 PHY 留在片外。更灵活、密度更高的芯片技术已经可以实现 MAC 和 PHY 的单芯片整合。...Unidirectional enable: 如果PHY通过比特1.7报告它不具备编码和传输来自媒体独立接口的数据的能力,而不管PHY是否确定已建立有效链路,则PHY应在比特0.5中返回零值,并且 任何尝试写一个到位...当读为逻辑0时,位1.7指示PHY只有在PHY确定已建立有效链路时才能从媒体独立接口传输数据。...如果自动协商通过清除位0.12禁用,则PHY应在位1.5返回零值。 如果PHY缺乏执行自动协商的能力,它还应在位1.5返回零值。...不会传输选择器字段的预留组合。

    9.1K23

    iOS 开发:『Runtime』详解(二)Method Swizzling

    _AFURLSessionTaskSwizzling 主要解决了 iOS7 和 iOS8 系统上 NSURLSession 差别的处理。让不同系统版本 NSURLSession 版本基本一致。...在交换了方法后并且不调用原生方法的实现可能会造成底层实现的崩溃。...我们改变的不只是一个对象实例,而是改变了项目中所有的该类的对象实例,以及所有子类的对象实例。所以,在使用 Method Swizzling 的时候,应该保持足够的谨慎。...当返回数据,刷新 TableView、CollectionView 时候,进行判断,如果数据为空,则加载占位图。如果数据不为空,则移除占位图,显示数据。...防止程序崩溃,可以通过 Method Swizzling 拦截容易造成崩溃的系统方法,然后在替换方法捕获异常类型 NSException ,再对异常进行处理。

    2K31

    2023携程面试真题

    处理流:也叫包装流,是对一个对于已存在的流的连接进行封装,通过所封装的流的功能调用实现数据读写。如添加个 Buffering 缓冲区。...一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。...选择器(Selectors) Java NIO 的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道...Selectors(选择器):Java NIO 引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。...流平台具有三个关键功能: 消息队列:发布和订阅消息流,这个功能类似于消息队列,这也是 Kafka 也被归类为消息队列的原因。

    21220

    Sentry 企业级数据安全解决方案 - Relay 监控 & 指标收集

    invalid: 数据被视为无效且无法恢复。原因表明验证失败。 http_queue.size (Histogram) 排队等待发送的上游请求数。 尽可能使连接保持活动。...processing.produce.error (Counter) 在信封已排队发送到 Kafka 后发生的生产者错误数。...SDK 无法在所有情况下立即传输有效载荷。有时,崩溃需要在重新启动应用程序后发送事件。同样,SDK 在网络停机期间缓冲事件以供以后传输。该指标衡量事件发生时间与其到达 Relay 时间之间的延迟。...该指标标记为: result: 请求发生了什么,具有以下值的枚举: success: 请求已发送并返回成功代码 HTTP 2xx response_error: 请求已发送并返回 HTTP 错误。...该指标标记为: result: 请求发生了什么,具有以下值的枚举: success: 请求已发送并返回成功代码 HTTP 2xx response_error: 请求已发送并返回 HTTP 错误。

    1.4K40

    如何做到“恰好一次”地传递数十亿条消息,结合kafka和rocksDB

    你发送的某些数据在服务器上已经被处理,但客户端却无法收到服务器的响应消息。...如果消息已存在于RocksDB,则worker不会将其发布到输出主题,而是更新输入分区的偏移,确认已处理过该消息。...这是什么写入新的键这么快的原因。无需更新文件,无需写入扩展。相反,在带外压缩阶段,同一级别的多个SSTable可以合并成一个新的文件。 ?...如果去重worker因为某些原因发生崩溃,或者遇到Kafka的某个错误,则系统在重新启动时,会首先查阅这个“事实来源”,输出主题,来判断事件是否已经发布出去。...通过将更多的数据转移到磁盘,并利用多种不同级别的文件和索引,能够大幅削减成本。对于故障切换,我们能够使用冷备(EBS),而不用运行其他的热备实例。

    1.2K10

    你知道 log4j2 各项配置的全部含义吗?带你了解 log4j2 的全部组件

    SocketAppender -- 以 socket 的方式发送到远程主机。 6....常用的 Layout Appender 解决了日志打印到哪里的问题,而 Layout 则解决日志如何打印,也就是日志格式问题,这也就是 Layout 也被称为 Formatter 的原因。...实例 <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{...有时我们更想要知道线上场景下究竟发生了什么,但现实情况我们又不能让所有人都打印出 debug 级别的日志,有什么办法只让符合条件的请求打印出 debug 级别的日志吗?...但问题在于,无论 log4j2 提供了多么强大的功能,都无法保证能够完美覆盖所有的场景,那么,当我们遇到了上述所有支持的功能所无法满足的场景时,我们应该如何去解决呢?

    2.5K20

    redis分布式知识点概念

    解决方案 在代码层面做判断限制非法数据的请求; 使用布隆过滤器,记录key是否存在,不存在则直接返回,使请求不达到数据层面; 缓存击穿 什么是缓存击穿?...缓存击穿是指因并发原因,大量数据请求同一个key值,而该key值刚好过期,导致所有请求都去数据库层面获取数据,最终导致数据库停止服务。...,需要把获取锁,设置过期时间作为一个原子操作执行,可使用上面介绍的Lua脚本执行,释放锁应只能由获取锁的客户端才能释放,避免别的客户端释放锁。...,客户端异常崩溃,EXPIRE 没有机会执行   在这个场景中,由于没有设置过期时间,那么如果客户端崩溃,没有释放锁,其他客户端就无法再获取到锁。...无法实现公平锁;3.

    55310

    如何使用Selenium WebDriver查找错误的链接?

    链接到已移动或删除的内容,如视频,文档等。如果内容被移动,则“内部链接”应重定向到指定的链接。 网站维护导致网站暂时停机,导致该网站暂时无法访问。...由于这些范围中的每一个都包含不同类别的服务器响应,因此我们将讨论范围限于为断开的链接提供的HTTP状态代码。...400(错误请求-超时) 这表明HTTP请求已超时。 400(错误请求-空) 服务器返回的响应为空,没有内容,也没有响应代码。...400(错误请求-重置) 这表明服务器无法处理该请求,因为它正忙于处理其他请求或站点所有者对其进行了错误配置。 403(禁止) 真正的请求已发送到服务器,但由于需要授权,因此拒绝履行该请求。...指向410页的链接将访问者发送到无效资源。 503服务不可用) 这表明服务器暂时超载,因此服务器无法处理请求。这也可能意味着正在服务器上进行维护,从而指示搜索引擎有关站点的临时停机时间。

    6.7K10

    【IOS开发高级系列】Objective-c Runtime专题总结

    每个方法名都对应一个 SEL 类型的方法选择器,而每个实例对象中的SEL 对应的方法实现肯定是唯一的,通过一组 id 和 SEL 参数就能确定唯一的方法实现地址;反之亦然。...NSObject 类中有个 methodForSelector: 实例方法,你可以用它来获取某个方法选择器对应的IMP,举个栗子: void (*setter) (id, SEL, BOOL); int...instanceProperties表示Category里所有的properties,这就是我们可以通过objc_setAssociatedObject和objc_getAssociatedObject增加实例变量的原因...如果你想让该方法选择器被传送到转发机制,那么就让 resolveInstanceMethod: 返回 NO 。...key;     UIButton *btn = [UIButton buttonWithType: UIButtonTypeCustom];     [btn setTitle: @"点我" forState

    38130

    我发现很多程序员都不会打日志。。

    此外,它只能输出简单的信息到标准控制台,无法灵活设置日志级别、格式、输出位置等。...所以我们可以使用 this.getClass 动态获取当前类的实例,来创建 Logger 对象: public class MyService { private final Logger logger...1、合理选择日志级别 日志级别的作用是标识日志的重要程度,常见的级别有: TRACE:最细粒度的信息,通常只在开发过程中使用,用于跟踪程序的执行路径。...可以添加条件来控制,比如在批量处理时,每处理 1000 条数据时才记录一次: if (index % 1000 == 0) { logger.info("已处理 {} 条记录", index);...在 Java 代码中,可以为 MDC 变量设置值: MDC.put("requestId", "666"); MDC.put("userId", "yupi"); logger.info("用户请求处理完成

    10811

    runtime官方文档翻译版本通过OC源代码通过NSObject中定义的方法直接调用运行时的函数消息传递机制使用隐藏参数获取方法地址动态方法解析动态加载消息转发转发和多继承代理对象转发和继承类型编码声

    在下面的实例中,_cmd引用strange方法的选择器,自己作为strange消息的接收对象。 ? 图 Self比两个参数更有用。事实上,这是接收对象的实例变量提供了方法的定义方式。...如果你只不过是实现了resolveInstanceMethod:想要通过转发机制转发特别的选择器,你应该为那些选择器返回NO; 动态加载 一个OC在它运行的时候可以加载链接很多类和分类。...实现这一方法的方式是让你的类继承于别的类的方法。然而,它不可能通过这种方式来安排事情。这有很多好的为什么你的类和实现了谈判的类在继承结构的不同分支的原因。...forwardInvocation:消息提供了第二个机会:另外一个不是那么特别的解决方案,是动态而不是静态。它是像这样工作的:当一个对象因为没有这个消息对应的方法选择器来响应这个消息。...所有类型的返回值都可以传递给发送者,包括id类型,结构体,单精度和双精度浮点数。 forwardInvocation:像一个为无法识别消息工作的分配中心,把他们打包到不同的接收器。

    1.6K70

    iOS_Crash 异常类型

    如果 Swift 运行时遇到编程错误,运行时会捕获该错误并故意使程序崩溃,这些崩溃在崩溃报告中具有可识别的异常信息: 在 ARM 处理器: Exception Type: EXC_BREAKPOINT...向已释放的对象发送消息可能会导致OC运行时的objc_msgSend、objc_retain、objc_release函数崩溃。...KERN_INVALID_ADDRESS:通过访问数据或取指令来访问未映射的内存 KERN_PROTECTION_FAILURE:尝试使用受保护的有效内存地址 KERN_MEMORY_ERROR:尝试访问但是无法返回数据的内存...x86_64 CPU 架构返回地址存储在堆栈上,而不是链接寄存器中,所以无法追踪函数指针来源。 ---- 3....EXC_CRASH(SIGKILL) 操作系统终止了该进程,报告中的 Termination Reason 带有解释崩溃原因的代码。

    2K20

    Loki漫谈

    通过这一套框架可以在线监控服务运行状态,如果不正常,能够通过各种途径通知给相关人员;相关人员通过查看告警信息,通过日志分析出现问题具体原因。 如何查看日志?...我们可以进入Pod中查询,如果Pod进程已经崩溃,那么将无法进入容器内部,没关系,Pod所在宿主机挂载的日志文件,你不得不查询已经崩溃Pod所在宿主机,然后通过命令行进入宿主机中查询日志,这样的话如果碰到一个服务多个副本运行在同一个节点上...,那么可能会出现日志交叉打印的情况,服务崩溃还没有解决,你已经崩溃了,其实出现这种问题的真正原因是Kubernetes超强的自动横向扩容能力,你可能无法准确预测到服务副本数量和所在节点,大多数公司是基于...当ingester收到不遵循此顺序的日志时,日志行将被拒绝,并返回错误(Entry out of order)。...会创建chunk或者或者追加数据到已存在chunk上面(必须保证租户和标签唯一),最后完成数据存储。

    2K51
    领券