نسافيبانيل ليس حفظ ملف بعد وضع الحماية التطبيق
-
13-12-2019 - |
سؤال
أواجه مشكلة في حفظ ملف سلسلة مع 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
في مصحح كسكودي).يجب أن تساعدك على معرفة ما هو الخطأ.