【问题标题】:Creating multiple themes in an iPhone App在 iPhone 应用程序中创建多个主题
【发布时间】:2014-03-17 10:28:31
【问题描述】:

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

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

我有一个标签栏控制器,并将第 5 个标签设置为“设置”标签,其中包含一个带有单元格的表格视图。第一个单元格包含文本“主题”,用户可以在其中选择它,被带到新的表格视图/集合视图以选择主题。

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

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;
}

在我的表格视图中,将应用主题(它将应用到应用程序中的每个屏幕,但这只是从我在应用程序中测试一个场景的地方开始),在 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 文件,并且为了让用户进入我的应用程序中的设置选项卡,单击“主题”单元格并能够选择一个应用程序的不同主题而无需重新启动应用程序。

我知道本教程确实对此进行了解释,但我不太确定我是否全部理解。

对此的任何指导将不胜感激。

非常感谢,

【问题讨论】:

标签: ios iphone themes plist


【解决方案1】:

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

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

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

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

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

瞧!

【讨论】:

  • 亲爱的@Mikael - 非常感谢您的回复,很抱歉这个问题很长;我想提供尽可能多的信息。您的解决方案看起来令人难以置信,可以实现这一目标。我只需要澄清一些小事:在视图控制器中,我创建了对 SharedInstance 的引用——我将如何设置背景?例如,如果用户单击第二个单元格,我将如何在 viewWillAppear 中专门“设置”主题?另外,如何让这个主题成为整个应用程序的主题? (大约有 11 个不同的场景需要以所选主题为主题)非常感谢
  • 本质上,我前面的评论的意思是:如何让用户选择主题来主题整个应用程序?因此,如果用户进入应用程序的设置,点击主题,选择“黑暗”,我如何突然让整个应用程序都以它为主题,每一个场景?
  • 在每个视图控制器中你做:Formater *formater = [Formater sharedInstance]; 然后你可以在视图控制器中做:[self.view.backgroundColor = formater.backgroundColor];
  • 谢谢 Mikael - 这是有道理的。我感到困惑的是如何“捕获”用户从“设置表视图”中选择的主题。所以用户转到设置,从表视图中选择一个“主题”,我知道如何使用 didSelectRow 捕获选定的行,但是我如何将它传递给其他表视图,然后将你的 Formatter sharedInstance 代码放入?例如,我会使用委托吗?
  • 您也可以将其设为 Formater 的属性。存储它的位置取决于您的应用程序的结构。选项 1:您将其保存在服务器上并在登录时将其传递给应用程序。选项 2:您在应用程序上设置它并将其存储在 NSUserDefaults 中。
猜你喜欢
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
相关资源
最近更新 更多