سؤال

أواجه مشكلة في حفظ ملف سلسلة مع NSSavePanel بعد وضع الحماية التطبيق لماك المتجر.أنا وضعت com.apple.security.files.user-selected.read-write إلى YES و ال NSOpenPanel يعمل كما ينبغي.

عندما أحاول حفظ ملف جديد ، على الرغم من ذلك ، يبدو أن كل شيء يعمل بشكل جيد ولكن بعد ذلك لا يوجد ملف محفوظ حيث ينبغي أن يكون....

هذا هو الرمز الذي أستخدمه لحفظ الملف:

NSSavePanel *save = [NSSavePanel savePanel];

long int result = [save runModal];

if (result == NSOKButton)
{
    NSString *selectedFile = [save filename];
    NSString *fileName = [[NSString alloc] initWithFormat:@"%@.dat", selectedFile];
    NSString *arrayCompleto = [[NSString alloc]initWithFormat:@"bla bla bla"];
    [arrayCompleto writeToFile:fileName
                    atomically:NO
                      encoding:NSUTF8StringEncoding
                         error:nil];
}
هل كانت مفيدة؟

المحلول

أولا وقبل كل شيء ، فإن -[NSSavePanel filename] تم إهمال المحدد.استخدام -[NSSavePanel URL] بدلا من ذلك.ثانيا ، الطريقة التي -[NSString writeToFile:atomically:encoding:error] يخبرك ما تفعلونه الخطأ هو مع error:(NSError**) حجة.

يجب عليك أيضا التعامل مع أخطاء إدخال / إخراج الملف على وجه الخصوص ، لأنه حتى إذا كانت التعليمات البرمجية صحيحة بنسبة 100 ٪ ، فقد لا تزال هناك أخطاء في نظام المستخدم (امتيازات غير كافية ، إلخ.) وعرض الخطأ على المستخدم سيسمح لهم برؤيته فشل (ولديهم فكرة عن السبب).سيسمح التعامل مع الخطأ في الكود أيضا بتعافي تطبيقك.على سبيل المثال ، إذا حاولت القراءة في الملف أسفل الرمز الذي قمت بلصقه (بعد كتابته على القرص) ، ولكن المستخدم حاول كتابته إلى مشاركة شبكة لم يكن لديه حق الوصول إليها ، فقد يتعطل تطبيقك.إذا كنت تعلم أن الكتابة فشلت ، فيمكنك المتابعة وفقا لذلك (ربما المطالبة بموقع حفظ مختلف).

في هذه الحالة ، على الرغم من أنني أعتقد أن السطر التالي هو مشكلتك:

NSString *fileName = [[NSString alloc] initWithFormat:@"%@.dat", selectedFile];

عندما يكون التطبيق الخاص بك في وضع الحماية ، يحتاج المستخدم إلى منحك الإذن لأي من ملف محدد أو أ دليل محدد من خلال فتح/حفظ لوحات لتقديمهم إلى رمل الخاص بك.ما تفعله هو أخذ الملف الذي أعطاك المستخدم الإذن بالكتابة والقول" هذا رائع ، لكني أريد حفظ ملف مختلف " ، والذي ينتهك وضع الحماية.ما يجب عليك فعله بدلا من ذلك هو تعيين الامتداد في لوحة الحفظ.الحل الثابت الكامل سيكون:

NSSavePanel *save = [NSSavePanel savePanel];
[save setAllowedFileTypes:[NSArray arrayWithObject:@"dat"]];
[save setAllowsOtherFileTypes:NO];

NSInteger result = [save runModal];

if (result == NSOKButton)
{
     NSString *selectedFile = [[save URL] path];
     NSString *arrayCompleto = @"bla bla bla";

     NSError *error = nil;
     [arrayCompleto writeToFile:selectedFile
                     atomically:NO
                       encoding:NSUTF8StringEncoding
                          error:&error];
}

if (error) {
    // This is one way to handle the error, as an example
    [NSApp presentError:error];
}

إذا كان هناك خطأ آخر في المستقبل ، يمكنك التحقق من قيمة error في وقت التشغيل.أثناء التصحيح ، قم بتعيين نقطة توقف داخل if (error) بيان للتحقق error قيمة الكائن (هل po error في مصحح كسكودي).يجب أن تساعدك على معرفة ما هو الخطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top