سؤال

كنت أخلق هيكل بيانات يدويا باستخدام ما يلي:

NSDictionary* league1 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Barclays Premier League", @"name",
                 @"Premier League", @"shortname",
                 @"101", @"id", nil];
NSDictionary* league2 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Coca-Cola Championship", @"name",
                 @"Championship", @"shortname",
                 @"102", @"id", nil];
NSDictionary* league3 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Scottish Premier League", @"name",
                 @"SPL", @"shortname",
                 @"201", @"id", nil];
NSDictionary* league4 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Champions League", @"name",
                 @"UCL", @"shortname",
                 @"501", @"id", nil];

contentArray = [[NSArray alloc] initWithObjects:

                [[NSDictionary alloc] initWithObjectsAndKeys: @"English", @"category", [[NSArray alloc] initWithObjects: league1, league2, nil], @"leagues", nil],
                [[NSDictionary alloc] initWithObjectsAndKeys: @"Scottish", @"category", [[NSArray alloc] initWithObjects: league3, nil], @"leagues", nil],
                [[NSDictionary alloc] initWithObjectsAndKeys: @"Tournaments", @"category", [[NSArray alloc] initWithObjects: league4, nil], @"leagues", nil],
                nil];

[league1 release];
[league2 release];
[league3 release];
[league4 release];

ومع ذلك، اعتقدت أن هذا سيكون أفضل إذا تم قراءة من ملف. لذلك قمت بإنشاء ملفات الملف .plist التي لديها الهيكل التالي:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <array>
        <dict>
            <key>category</key>
            <string>English</string>
            <key>leagues</key>
            <array>
                <dict>
                    <key>name</key>
                    <string>Barclays Premier League</string>
                    <key>shortname</key>
                    <string>Premier League</string>
                    <key>id</key>
                    <string>101</string>
                </dict>
                <dict>
                    <key>name</key>
                    <string>Coca-Cola Championship</string>
                    <key>shortname</key>
                    <string>Championship</string>
                    <key>id</key>
                    <string>102</string>
                </dict>
            </array>
        </dict>
        <dict>
            <key>category</key>
            <string>Scottish</string>
            <key>leagues</key>
            <array>
                <dict>
                    <key>name</key>
                    <string>Scottish Premier League</string>
                    <key>shortname</key>
                    <string>SPL</string>
                    <key>id</key>
                    <string>201</string>
                </dict>
            </array>
        </dict>
        <dict>
            <key>category</key>
            <string>Tournaments</string>
            <key>leagues</key>
            <array>
                <dict>
                    <key>name</key>
                    <string>Champions League</string>
                    <key>shortname</key>
                    <string>UCL</string>
                    <key>id</key>
                    <string>501</string>
                </dict>
            </array>
        </dict>
    </array>
</plist>

كيف قرأت هذا الملف في. لقد جربت طرق مختلفة ولكن لا شيء قد عمل. أنا لا أعرف حتى إذا كنت أبحث في المكان المناسب للملف. للرجوع اليها، أحاول الطرق التالية:

NSString* errorDesc = nil;
NSPropertyListFormat format;
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"];
NSData* plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
contentArray = (NSArray*)[NSPropertyListSerialization
                                     propertyListFromData:plistXML
                                     mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                     format:&format
                                     errorDescription:&errorDesc];

if (!contentArray) {
    NSLog(errorDesc);
    [errorDesc release];
}

أو

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"];
contentArray = [NSArray arrayWithContentsOfFile:plistPath];

أو

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];

NSString *fooPath = [documentsPath stringByAppendingPathComponent:@"leagues.plist"];
NSLog(fooPath);
contentArray = [NSArray arrayWithContentsOfFile:fooPath];
NSLog(@"%@",contentArray);

هذا يقودني أخيرا مجنون تماما. ساعدنى من فضلك!

شكرا لك أيها الطيب

هل كانت مفيدة؟

المحلول

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"];
contentDict = [NSDictionary dictionaryWithContentsOfFile:plistPath];

هذا الجواب صحيح - هل أنت متأكد من أن الملف الخاص بك في التطبيق؟ هل قمت بإضفته إلى مشروعك، والتحقق من معرفة ما إذا كان يتم نسخه في حزمة التطبيق الخاصة بك؟ إذا لم يكن الأمر كذلك، فقد يكون الملف لم يتم إضافته إلى الهدف الذي تقوم ببناءه، وهو خطأ سهلا لجعله خاصة إذا كان لديك أهداف متعددة.

نصائح أخرى

استخدم هذا الرمز إذا كان plist في مجلد الموارد للمشروع.

  NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"league"    ofType:@"plist"];
 contentArray = [NSArray arrayWithContentsOfFile:sourcePath];

إذا كان plist يوجد داخل دليل المستند من التطبيق استخدام هذا:

    NSArray *paths = 
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;

NSString *plistName = @"league";
NSString *finalPath = [basePath stringByAppendingPathComponent: 
                       [NSString stringWithFormat: @"%@.plist", plistName]];



contentArray = [NSArray arrayWithContentsOfFile:finalPath];

كان لدي هذه المشكلة، لكنها لم تكن تعمل لأنني كنت أضع النتائج من المعطر إلى صفيف حيث كان ينبغي القاموس، أي

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"VehicleDetailItems" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

كيندال هو الصحيح.

في تجربتي، تحتاج إلى إضافة ملفك إلى مجلد "الموارد" في Xcode.

للكمال، Kendall و Bentford صحيح تماما. ومع ذلك، في عينة، كان CONTERTRAYSTRAY خاصية وبحلول نهاية الطريقة كان يخرج من النطاق بسبب arriefithcontentsoffile. يخلق كائن تم إصداره تلقائيا.

لجعل هذا العمل بشكل صحيح كنت بحاجة إلى القيام به 3 أشياء:

  1. ضع الملف في مجلد الموارد

  2. قم بتسمية الملف بشكل صحيح (كان بطولات الدوري) بدلا من الدوري .plist)

  3. قراءة الملف باستخدام [nsarray alloc] interwithcontentsoffile: PlistPath)]؛

الجزء الثالث يخلق NSAray مخصص لا يفرج عند الخروج من نطاق هذه الوظيفة ... بالطبع، يلزم إصدار هذا في وظيفة Deallec.

فقط لإضافة. كان لدي نفس المشكلة وساعدني الحل المقترح في حل المشكلة، لكنني لست متأكدا مما إذا كنت قد استخدمت الحل الدقيق بالفعل. في حالتي كانت المشكلة مفادها أنه تمت إضافة الملف .plist إلى هدف مختلف (أضاف استهداف جديد لحظة من قبل). لذلك كان الحل .plist> الحصول على معلومات> الأهداف، وتأكد من إضافة الهدف الصحيح لذلك يتم نسخها إلى الجهاز عند التثبيت. كان الرتقني أنني قريبا بما فيه الكفاية كنت قد أنقذ الكثير من الوقت. آمل أن يكون هذا مفيدا جدا. يعتبر!

إذا لم يتم إضافة الملف في مجلد الموارد ويتم وضعه فقط في دليل المستندات. يمكنك ان تفعلها

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"file.plist"];
NSMutableArray *arrContentsplist = [[NSMutableArray alloc] initWithContentsOfFile:path];

هذا الرمز يعمل

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plist-name" ofType:@"plist"];
NSDictionary *Dictionary= [[NSDictionary alloc]initWithContentsOfFile:plistPath];
NSLog(@" current version CFBundleVersion = %@",[Dictionary valueForKey:@"CFBundleVersion"]);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top