硬编码这些数据的最佳方法是什么? Objective-C的

时间:2014-05-08 09:13:59

标签: ios objective-c arrays nsarray

我在应用中有一个视图是一个帮助功能。

此视图包含textview和tableview。表格视图包含大量问题,当用户选择问题时,它会在UITextView中显示答案。

我要做的是对这些数据进行硬编码。现在我可以获得视图,工作得很好而且简单,只是背后的代码不是最干净的,并且问题和答案总是在变化,我希望这些数据能够轻松存储。我在想的是像这样的NSMutableArray。

NSMutableArray *HelpPage = [NSMutableArray arrayWithObjects: <answers,questions here>

如何在

中说出这样的话
NSMutableArray* HelpPage = [NSMutableArray arrayWithObjects: 
@"How do i close", @"Press close button"
@"How do i open", @"Press the open button",

顺便说一句我应该添加这些只是例子lol。

理想情况下,我喜欢它在单独的.h / .m文件中,所以人们可以向我发送更新版本,而且我不需要花费多少时间来合并。

这是NSMutableArray最佳方式吗?

在应用程序的其他方面,我记录用户的种族,我在这里做的是

.h file
+ (NSArray*) ArrayofEthnicity;

.m file
+ (NSArray*) ArrayofEthnicity{
    return [NSArray arraywithObjects: @"English", @"French", @"German", nil];
} 

每次我需要打电话

NSArray* Data = [EthnicityData ArrayofEthnicity];

有更好的方法吗?

由于

5 个答案:

答案 0 :(得分:2)

这取决于你有多少时间使用问题和答案数据以及你需要存储多少数据。

如果您有大量数据需要阅读几次,则应将其写入.plist文件。

如果您的问题和答案很少,并且您需要在应用中花费大量时间,那么您可以将它们存储到单个实例中存储的NSMutableArrayNSMutableDictionary中从代码中的任何地方访问它。

另一种解决方案是使用Core Data。实施时间更长,但这是最强的方式。

核心数据使您可以在应用程序内部使用SQLite数据库来存储和读取数据,但您也可以使用它来从远程Web服务中读取数据。 有一次,这个解决方案实施的时间最长,但如果你需要一个非常优化且设计精良的解决方案,这是最好的方法。

答案 1 :(得分:2)

最好的方法是属性列表文件。 (也称为.plist文件)

请查看Apple编程指南... https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/PropertyLists/QuickStartPlist/QuickStartPlist.html

以下指南中的简短示例。从本质上讲,它是存储应用程序参数的好地方。

清单1-2 读入并转换XML属性列表

- (id) init {

    self = [super init];
    if (self) {
        NSString *errorDesc = nil;
        NSPropertyListFormat format;
        NSString *plistPath;
        NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
           NSUserDomainMask, YES) objectAtIndex:0];
        plistPath = [rootPath stringByAppendingPathComponent:@"Data.plist"];
        if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
            plistPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
        }
        NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
        NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization
            propertyListFromData:plistXML
            mutabilityOption:NSPropertyListMutableContainersAndLeaves
            format:&format
            errorDescription:&errorDesc];
        if (!temp) {
            NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
        }
        self.personName = [temp objectForKey:@"Name"];
        self.phoneNumbers = [NSMutableArray arrayWithArray:[temp objectForKey:@"Phones"]];

    }
    return self;
}

答案 2 :(得分:2)

您可以使用NSMutableDictionary存储问题和答案

NSMutableDictionary *qAndA = [[NSMutableDictionary alloc] init];
// add all Q&A with object is answer, key is question
[qAndA setObject:@"Press close button" forKey:@"How do i close"];
[qAndA setObject:@"Press the open button" forKey:@"How do i open"];
// to list all question
NSArray *questions = [qAndA allKeys];
.................................. 
// when need answer to a question
NSString *question = @"How do i close";
NSString *answer = [qAndA objectForKey:question];

答案 3 :(得分:1)

json是AFAIK最易读的格式。您的JSON文件将如下所示

{
     "How do I close": "Press close",
     "How do I open": "Press open"
}

或者,以数组格式,

[
     "How do I close", "Press close",
     "How do I open", "Press open"
]

使用NSJSONSerialization加载几行代码。

祝你好运!

答案 4 :(得分:1)

在我看来,plist不是存储人类可读文本的最佳方式,JSON不是最易读的格式。特别是如果文件的维护者不是开发人员,我认为就是这种情况。

我宁愿在降价中编写帮助文本,其中包含一些固定的简单结构,例如每个问题的标题+自由文本。或者更详细的列表,链接,无论你需要什么。

# Question 1

Answer 1 goes here.

# Question 2

Answer 2...

然后我会写一个解析器将文本导入内部格式,以便向用户显示它们(一组字典或类似的东西)。

你写了一次,然后只更新文本文件。维护者可以使用markdown编辑器来验证语法。

幸运的是,有ton markdown parsers来破解这个问题。我推荐libsoldout,专为编写自定义解析器而设计。

我写了sample project to demo it