IBDesignable UILabel将文本设置为drawRect或willMoveToSuperview中的NSLocalizedString会导致Xcode

时间:2016-04-05 21:04:48

标签: ios objective-c xcode ibdesignable

我正在尝试通过继承IBDesignable来追溯本地化应用,以获得如此属性:

@property IBInspectable NSString *localizedKey;

然后我想我可以在UILabel的生命周期中轻松覆盖正确的函数来执行此操作:

if (self.localizedKey) self.text = NSLocalizedString(self.localizedKey, nil);

以下是我尝试做的一个例子:

- (void) drawRect:(CGRect)rect {
    NSLog(@"roundedlabel");
    [super drawRect:rect];
    [self.layer setCornerRadius:cornerRadius];
    [self.layer setMasksToBounds:YES];
    [self.layer setBorderWidth:borderWidth];
    [self.layer setBorderColor:[borderColor CGColor]];
    self.clipsToBounds = YES;
}

- (void) willMoveToSuperview:(UIView *)newSuperview {
    [super willMoveToSuperview:newSuperview];
    NSLog(@"roundedlabel");
    if (self.localizedKey) self.text = NSLocalizedString(self.localizedKey, nil);
}

我还尝试将if (self.localizedKey)移到drawRect的各个位置。

我的计划是手动设置Localizable.strings文件,并通过localizedKey文件分配已知的XIB文件。但是,我发现了两件事。

  1. 好像在生命周期中调用了正常的方法 我没有为我的IBDesignable UILabel子类调用视图。 我已将日志语句输入drawRectwillMoveToSuperview,这些日志语句永远不会打印出来。
  2. XCode几乎总是崩溃&我试图打开时立即关闭 Interface Builder中的xib,包含此子类标签(因此没有错误消息)。
  3. 在运行时,当我看到涉及受影响的xib的视图时,我看不到本地化字符串的任何迹象,并且我在日志中的任何位置都看不到“roundedlabel”。

    发生了什么事?特别是:

    (1)为什么我的子类IBDesignable UILabel子类根本不运行这些函数? (2)有办法做我想做的事吗?

1 个答案:

答案 0 :(得分:0)

我在UILabel上创建扩展,并使用storyboard / XIB中的运行时键值来设置本地化密钥。

extension UILabel {
    func setHBLocalisationKey(key: String) {
        self.text = ...
     }
}

@implementation UILabel (HBLocalisation)

    - (void)setHBLocalisationKey:(NSString *)key {
        self.text = NSLocalizedString(key, nil);
    }

@end

现在可以在任何标签上使用,无需自定义子类,并且它不会篡改Xcode UI,这似乎会导致您当前的方法出现一些问题。