iOS应用程序:UIButton标记在控制器代码中不可用

iOS应用程序:UIButton标记在控制器代码中不可用,ios,uibutton,interface-builder,Ios,Uibutton,Interface Builder,我编写了一个方法,将字体更改为viewcontroller的所有控件。该方法获取viewcontroller的根视图,并递归迭代所有视图以更改字体。为了了解必须应用于文本的文本样式,我将Interface Builder中的代码设置为每个控件的tag属性。除了UIButton实例之外,其他一切都可以正常工作。UIButtons没有IBOutlet,因为我不需要在代码中显式引用它们。问题是,我的控制器无法使用以下方法检索按钮标记值: int viewTag = [view tag]; 无论我在I

我编写了一个方法,将字体更改为viewcontroller的所有控件。该方法获取viewcontroller的根视图,并递归迭代所有视图以更改字体。为了了解必须应用于文本的文本样式,我将Interface Builder中的代码设置为每个控件的tag属性。除了UIButton实例之外,其他一切都可以正常工作。UIButtons没有IBOutlet,因为我不需要在代码中显式引用它们。问题是,我的控制器无法使用以下方法检索按钮标记值:

int viewTag = [view tag];
无论我在Interface Builder中设置了什么,它总是0。为什么?

下面是我使用的代码片段:

FontManager类

+ (void)setCustomFontToView:(UIView *)view {

    if ( [view isKindOfClass:[UILabel class]] &&
         [view respondsToSelector:@selector(setFont:)]  ) {

        int viewTag = [view tag];

        UIFont *font = nil;

        if ( viewTag == 1 ) {

            font = [UIFont fontWithName:@"Frutiger-Light" size:18];

        } else if ( viewTag == 2 ) {

            font = [UIFont fontWithName:@"Frutiger-Bold" size:20];
        }

        [(UILabel *) view setFont:font];
    }

    NSArray *childViews = [view subviews];

    if ( [childViews count] > 0 ) {

        for ( UIView *childView in childViews ) {
            [self setCustomFontToView:childView];
        }
    }
}
视图控制器

- (void)viewDidLoad
{
     .....
     [FontManager setCustomFontToView:self.view];
}

我认为您是在为UIButton设置标记值,而不是它的子项UILabel。这就是为什么它总是返回0。添加对UIButton和tag的检查,而不是将字体设置为title label。

创建iOutletCollection不是更容易吗?我认为您的标记设置为UIButton,而不是在标签上,并且标记在视图层次结构中也不是默认的

在IB控件中选择多个按钮并将其拖动到一个标题中,集合输出为一组按钮,您可以遍历这些按钮来更改字体


通过这种方式,完成这项工作所需的迭代次数更少。链接一组按钮确实不会对性能产生影响,但在遍历层次结构的每个子视图时会对性能产生影响,检查您是否可以更改标签。

出于好奇,您是否尝试为其添加
IBOutlet
?您说您没有为按钮创建IBOutlet,那么什么是myButton?@dasblinkenlight自动化过程的目标正是避免为每个控件创建IBOutlet:$@rdelmar看到我的编辑(抱歉出错)您有[view isKindOfClass:[UILabel class],所以这不会导致您的代码只更改标签的字体吗?我认为您应该尝试使用外观代理更有效地更改字体