多个iOS目标,具有不同的故事板样式

时间:2016-08-25 17:36:36

标签: ios storyboard xcode7 uistoryboard

我正在为多个客户开发原生iOS应用,我们正在为每个不同的客户使用多个目标。几乎所有的故事板都将被重复使用,因为每个客户的应用程序几乎相同。

问题是,我们需要使用每个客户的颜色和图像来定制故事板,我们不想复制故事板。所以我正在寻找像HTML中的CSS或类似Android中的样式以在iOS中应用的东西。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

我创建了一个库,它允许您以类似于CSS的方式设置故事板样式,但使用Swift代码或JSON样式表。

您可以为info.plist中的每个目标设置不同的样式表,而无需更改任何其他代码。

链接到更多信息here

答案 1 :(得分:0)

有很多方法可以实现这一目标。这是我的想法。

创建一个名为Style的NSObject。它将保存您需要更改的所有信息。因此,例如,如果您需要为四个视图控制器中的每一个设置不同的标题,每个视图控制器使用不同的背景颜色,而在其中两个视图控制器中使用不同的图像,它可能如下所示:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface Style : NSObject

@property (nonatomic, retain) NSString* first_title;               
@property (nonatomic, retain) NSString* second_title;
@property (nonatomic, retain) NSString* third_title;
@property (nonatomic, retain) NSString* fourth_title;
@property (nonatomic) UIColor* first_background_color;
@property (nonatomic) UIColor* second_background_color;
@property (nonatomic) UIColor* third_background_color;
@property (nonatomic) UIColor* fourth_background_color;
@property (nonatomic) UIImage* first_image;
@property (nonatomic) UIImage* second_image;

@end

然后,在Style.m中,您可以使用方法将此信息保存到内存中,如下所示:

// encode a card to memory
- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:first_title forKey:@"first_title"];
    // etc etc etc
}

// decode a card from memory
- (id)initWithCoder:(NSCoder *)coder {
    self = [self init];
    self.first_title = [coder decodeObjectForKey:@"first_title"];
    // etc etc etc
    return self;
}

接下来,您可以(在您的应用中委托或基本上在任何地方)创建样式的NSArray * - 每个涉及的公司一个。我可以想到有很多地方可以做到这一点 - 您可以在didFinishLaunchingWithOptions中的app委托中执行此操作,或者您甚至可以在服务器上存储一些TSV文件,在viewDidLoad中获取它们并将它们解析为此数组。任何你想要的!无论如何,一旦你有一些很棒的样式 - 每个公司一个 - 你可以像这样从app内存中取出并保存它:

-(void)writeArrayWithCustomObjToUserDefaults:(NSString*)keyName withArray:(NSMutableArray*)myArray {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray];
    [defaults setObject:data forKey:keyName];
    [defaults synchronize];
}

要从内存中恢复数组:

if ([[NSUserDefaults standardUserDefaults] objectForKey:@"Styles"] != nil) {
        NSData* existingData = [[NSUserDefaults standardUserDefaults] objectForKey:@"knives"];
        NSArray* styles = [NSKeyedUnarchiver unarchiveObjectWithData:existingData];

}

然后,在各种VC中,只需获取样式的NSArray,找到名称与目标对应的那个,并访问其变量来修改VC!

More information on getting target name here.

More information on that memory stuff here.