ios - 在 iPhone 应用程序中创建多个主题

标签 ios iphone themes plist

我最近在 App Store 发布了我的第一个应用程序,但 iOS 开发还有很长的路要走。

我希望将主题作为更新引入我的应用,以便用户可以从 4-5 个不同的主题中进行选择。

我有一个选项卡栏 Controller ,并将第 5 个选项卡设置为“设置”选项卡,其中包含一个带有单元格的 TableView 。第一个单元格包含文本“主题”,用户可以在其中选择它,然后转到新的 TableView / Collection View 以选择主题。

所以我在网上搜索并发现了这个令人难以置信的答案:

How to create Multiple Themes/Skins for iphone apps?

因为我对开发还很陌生,所以我需要帮助来推进这项工作。

首先,我有两个主题:

1)默认主题(Newiphonebackground.png)

2) PurplePinkTheme (Purplepinknew.png)

按照说明,我为默认主题创建了一个 plist,为 PurplePink 主题创建了一个 plist。

在我创建的 ThemeManager 类中,我有:

- (id)init
{
    if ((self = [super init]))
    {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSString *themeName = [defaults objectForKey:@"theme"] ?: @"DefaultTheme";

        NSString *path = [[NSBundle mainBundle] pathForResource:themeName ofType:@"plist"];
        self.styles = [NSDictionary dictionaryWithContentsOfFile:path];
    }
    return self;
}

+ (ThemeManager *)sharedManager
{
    static ThemeManager *sharedManager = nil;
    if (sharedManager == nil)
    {
        sharedManager = [[ThemeManager alloc] init];
    }
    return sharedManager;
}

在我的表格 View 中,主题将被应用(它将被应用到应用程序中的每个屏幕,但这只是从我在应用程序中测试一个场景的地方开始),在 viewDidLoad ,我把:

    NSDictionary *styles = [ThemeManager sharedManager].styles;
    NSString *imageName = [styles objectForKey:@"DefaultTheme"];
    UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];
    self.tableView.backgroundView = backgroundImageView;

这并没有什么不同,因为它应用了默认主题。但是,如果在 ThemeManager 中,我将 plist 更改为:

    NSString *themeName = [defaults objectForKey:@"theme"] ?: @"PurplePinkTheme";

在单独的 Table View 的 viewDidLoad 中,我将代码设置为:

    NSString *imageName = [styles objectForKey:@"PurplePinkTheme"];

然后在加载我的应用程序时,我的 PurplePinkTheme 会加载。

到目前为止一切顺利,但我不认为我在这里做了任何实质性的事情。

从这一点开始我很困惑。我希望从仅更改应用程序内设置的背景图像开始,完成后,我将考虑更改自定义导航栏等。

所以我的问题是:

1) 为什么我要为每个主题创建一个 plist?

2) 如何在 ThemeManager 类中链接多个 plist?

3) 如何将所有主题链接到允许用户选择的设置主题单元格?

很抱歉,这很含糊,但我真的需要了解我究竟可以在这里进行多长时间。例如,我只是不知道如何在 ThemeManager 中拥有多个 plist 以及如何从这里继续前进。

回顾一下,我现在只想拥有多个具有不同背景的 plist 文件,并且让用户进入我的应用程序中的设置选项卡,单击“主题”单元格并能够选择一个应用程序的不同主题,而无需重新启动应用程序。

我知道教程确实继续对此进行了解释,但我不太确定我是否理解了所有内容。

如有任何相关指导,我们将不胜感激。

非常感谢,

最佳答案

你的问题超长,所以我必须承认我没有读完整个问题。也就是说,我花了很多时间在主题上,我发现的最佳解决方案是创建一个处理格式的对象。这就是我认为您可以实现它的方式:

  1. 创建一个扩展 NSObject 的格式化对象
  2. 为主题的每个可变部分设置一个属性:

    例如,如果背景更改图像,您可以在其中有一个 UIImage 称为背景。如果字体颜色发生变化,则其中有一个 UIFont 属性。

  3. 通过添加以下内容创建您的格式化程序的共享实例:

     +(Formater *) sharedInstance; //add to .h
    
    
    + (Formater *) sharedInstance //add to .m
    {
        if (!_sharedInstance)
        {
            _sharedInstance = [[Formater alloc] init];
        }
    }
    
  4. 现在,在您的 View Controller 中,您需要做的就是创建对共享项的引用,并使用它来设置 View Controller 的样式。 (切记不要在viewWillAppear中进行更改,否则设置更改后不会更改。

瞧!

关于ios - 在 iPhone 应用程序中创建多个主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22451919/

相关文章:

ios - Metal 计算管道慢得离谱

ios - 在 iOS7 应用程序的单个屏幕中显示大量格式化文本的最佳方式是什么?

android - 是否可以在 iPhone 模拟器或 Android 模拟器中执行 ARM 程序集?

iphone - NSIncationOperation 和主线程

tomcat - 是否可以更改 Tomcat Web 应用程序管理器的主题或修改其 header ?

ios - 是否允许继承TWTweetCompose ViewController?我在 ios 6.0 上发生崩溃

ios - 如果在客户端生成 CKRecordID.recordName 有什么缺点吗?

iphone - 如何获取 UI 按钮 iPhone 的 X 和 Y 位置

c# - UWP 应用程序中的自定义主题

javascript - 如何使用多个不断变化的样式表在网站上制作主题?