iOS 17中MBProgressHUD调用setProgress报错,求最小修改方案
解决旧版MBProgressHUD在iOS 17上的setProgress:方法冲突问题
错误信息:
Multiple methods named 'setProgress:' found with mismatched result, parameter type or attributes
错误截图说明:Xcode编译器报错,提示存在多个同名setProgress:方法,参数或返回值类型不匹配,无法确定调用目标。
错误原因
iOS 17系统中的部分类(如UIProgressView)的setProgress:方法,与旧版MBProgressHUD的同名方法参数、返回值类型不兼容。当代码中通过id类型对象调用该方法时,编译器无法明确要调用的方法版本,从而触发报错。
最佳解决方案(按代码改动量从少到多排序)
1. 显式类型转换(最少改动)
将调用setProgress:的id类型对象强制转换为MBProgressHUD *,明确告诉编译器方法归属:
// 原报错代码 [idHUD setProgress:0.6f]; // 修改后代码 [(MBProgressHUD *)idHUD setProgress:0.6f];
如果项目中多处出现该问题,可以用宏简化重复转换:
#define HUDSetProgress(hud, progress) [(MBProgressHUD *)hud setProgress:progress] // 使用示例 HUDSetProgress(myHUDRef, 0.8f);
2. 新增分类方法(批量替换调用)
给MBProgressHUD添加分类,封装一个别名方法替代原setProgress:,避免直接触发方法冲突:
// MBProgressHUD+CustomProgress.h #import "MBProgressHUD.h" @interface MBProgressHUD (CustomProgress) - (void)setHUDProgress:(float)progress; @end // MBProgressHUD+CustomProgress.m #import "MBProgressHUD+CustomProgress.h" @implementation MBProgressHUD (CustomProgress) - (void)setHUDProgress:(float)progress { [self setProgress:progress]; } @end
之后将项目中所有setProgress:调用替换为setHUDProgress:即可,无需修改对象类型。
3. 关闭严格选择器匹配(应急方案)
在Xcode的项目Build Settings中,找到Objective-C - Language下的Strict Selector Matching,设置为NO。该操作会关闭编译器对同名方法的严格检查,但可能隐藏其他潜在的方法匹配问题,仅建议作为临时应急手段,不推荐长期使用。
内容的提问来源于stack exchange,提问作者Anden87
相关产品推荐
相关产品推荐

