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

时间:2013-11-16 23:02:24

标签: ios uibutton interface-builder

我编写了一个方法来将字体更改为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];
        }
    }
}

的ViewController

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

2 个答案:

答案 0 :(得分:1)

我认为你正在为UIButton而不是UILabel设置标签值,这是它的孩子。这就是它总是返回0的原因。添加一个UIButton和tag的检查,而不是将字体设置为标题标签。

答案 1 :(得分:1)

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

您可以在IB中选择多个按钮并将其拖动到标题中,该集合将作为NSArray按钮输出,您可以通过迭代来更改字体。

这样,完成工作所需的迭代次数就会减少。连接按钮集合确实没有性能影响,但是如果你甚至可以更改标签,那么在遍历层次结构检查的每个子视图时会产生性能影响。