如何通过UIButton与if-else语句实现UILabel字体来回切换?
解决UILabel字体来回切换失败的问题
我来帮你分析问题出在哪,然后给出可行的解决方案:
为什么你的两种写法都失效?
第一种写法的问题
你这里的判断逻辑完全偏离了需求:
if ( [UIFont fontWithName:@"HelveticaNeue" size:17.0]) { [labelz1 setFont:[UIFont fontWithName:@"ArialRoundedMTBold" size:17.0]]; } else if ( [UIFont fontWithName:@"ArialRoundedMTBold" size:17.0]){ [labelz1 setFont:[UIFont fontWithName:@"HelveticaNeue" size:17.0]]; }
[UIFont fontWithName:size:]这个方法的作用是检查系统中是否存在该字体,只要字体存在就会返回非空对象。而HelveticaNeue是iOS系统默认字体,所以你的第一个if条件永远为真,每次点击按钮都会执行第一个分支,把字体改成ArialRoundedMTBold,根本不会走到else if里。
第二种写法的问题
你用==来比较UIFont对象:
if ( labelz1.font ==[UIFont fontWithName:@"HelveticaNeue" size:17.0]) { // ... }
==在这里比较的是两个对象的内存地址,而不是字体的实际属性。即使是同一个字体,每次调用[UIFont fontWithName:size:]都可能创建新的对象,或者系统缓存的对象指针和label当前的font指针不一致,导致这个条件永远不成立。最终就会出现只能切换一次,无法切回的问题。
正确的两种解决方案
方案1:比较字体的名称属性
直接获取label当前字体的fontName,用字符串相等来判断,这是最直接的方式:
- (IBAction)toggleLabelFont:(UIButton *)sender { NSString *currentFontName = labelz1.font.fontName; // 注意:字体名称必须完全匹配,不确定的话可以先打印出来确认 // NSLog(@"当前字体名称:%@", currentFontName); if ([currentFontName isEqualToString:@"HelveticaNeue"]) { labelz1.font = [UIFont fontWithName:@"ArialRoundedMTBold" size:17.0]; } else if ([currentFontName isEqualToString:@"ArialRoundedMTBold"]) { labelz1.font = [UIFont fontWithName:@"HelveticaNeue" size:17.0]; } }
⚠️ 小提示:如果你的初始字体是从Storyboard/XIB设置的,建议先打印currentFontName确认准确的字体名称,比如HelveticaNeue可能有变体(如HelveticaNeue-Light),拼写错了会导致判断失效。
方案2:用状态变量记录当前字体
这种方式更可靠,避免字体名称拼写的问题:
- 先在你的ViewController里声明一个状态变量:
// 在.m文件的@interface扩展中声明 @interface YourViewController () @property (nonatomic, assign) BOOL isUsingHelvetica; // 记录当前是否使用Helvetica字体 @end
- 在
viewDidLoad里初始化状态(根据你的初始字体设置):
- (void)viewDidLoad { [super viewDidLoad]; // 假设初始字体是HelveticaNeue self.isUsingHelvetica = YES; }
- 在IBAction中切换字体并更新状态:
- (IBAction)toggleLabelFont:(UIButton *)sender { if (self.isUsingHelvetica) { labelz1.font = [UIFont fontWithName:@"ArialRoundedMTBold" size:17.0]; self.isUsingHelvetica = NO; } else { labelz1.font = [UIFont fontWithName:@"HelveticaNeue" size:17.0]; self.isUsingHelvetica = YES; } }
这样不管字体名称有没有拼写问题,只要初始状态设置正确,就能稳定实现来回切换的效果。
内容的提问来源于stack exchange,提问作者mrbool
相关产品推荐
相关产品推荐

