0

目前我正在使用 UISS 来更改我的应用程序的某些样式,但我认为不可能设置特定控件的样式。例如。如果我想更改带有标签 1 或 ID 为“xpto”的按钮的图像。有什么办法可以用 UIAppearance 或 UISS 做到这一点?

我有一个按钮,如:

UIButton *xpto = [[UIButton alloc] init];

我想在调用方法时为其设置主题,目前我正在使用 UISS 为我的对象设置主题

-(void) changeTheme:(NSString*)themeName{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:themeName ofType:@"json"];
    AppDelegate *dlg =[[UIApplication sharedApplication] delegate];
    dlg.uiss.style.url = [NSURL fileURLWithPath:filePath];
    [dlg.uiss reloadStyleAsynchronously];
}

.json 文件:

{
    "UIButton": {
        "titleColor:normal": "red"
     }
}

我唯一的问题是这会更改所有 UIButtons,我只想更改 xpto。有没有办法定义像下面这样的东西来只改变这个按钮。

    "UIButton#xpto": {
        "titleColor:normal": "red"
     }
4

1 回答 1

2

您可以通过在运行时创建类来做到这一点。

首先,在代码中可以看到的地方定义这个函数:

Class SGBCreateClassWithId(Class baseClass, NSString *classId)
{
    NSString *className = NSStringFromClass(baseClass);

    if (classId.length > 0)
    {
        className = [NSString stringWithFormat:@"%@#%@", className, classId];
    }

    Class subClass = NSClassFromString(className);

    if (!subClass)
    {
        subClass = (Class)objc_allocateClassPair(baseClass, [className UTF8String], 0);
        if (subClass)
        {
            objc_registerClassPair(subClass);
        }
    }

    return subClass;
}

现在,改变这一行:

UIButton *xpto = [[UIButton alloc] init];

对此:

Class classWithId = SGBCreateClassWithId([UIButton class], @"xpto")
UIButton *xpto = [[classWithId alloc] init];

现在您的按钮属于UIButton被调用的子类UIButton#xpto,因此您的 UISS 应该按照您想要的方式工作。

一个警告:UISS 仅识别在您加载 UISS JSON 文件时存在的类。因此,如果您确实以这种方式创建新类,则需要重新加载您的 UISS JSON。

于 2013-07-17T12:00:46.363 回答