You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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:用状态变量记录当前字体

这种方式更可靠,避免字体名称拼写的问题:

  1. 先在你的ViewController里声明一个状态变量:
// 在.m文件的@interface扩展中声明
@interface YourViewController ()
@property (nonatomic, assign) BOOL isUsingHelvetica; // 记录当前是否使用Helvetica字体
@end
  1. 在viewDidLoad里初始化状态(根据你的初始字体设置):
- (void)viewDidLoad {
    [super viewDidLoad];
    // 假设初始字体是HelveticaNeue
    self.isUsingHelvetica = YES;
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:25:24