سؤال

أنا أستخدم OpenPanel للحصول على عنوان URL لمسار الملف. هذا يعمل:

[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 NSURL *pathToFile = nil;

 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];

هذا لا ، مما يؤدي إلى خطأ "تخصيص متغير للقراءة فقط":

NSURL *pathToFile = nil;
[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];
return pathToFile;

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

شكرًا.

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

المحلول

هذا لا ، مما يؤدي إلى خطأ "تخصيص متغير للقراءة فقط":

NSURL *pathToFile = nil;
[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];
return pathToFile;

نعم ، لأنك تحاول تعيين نسخة من pathToFile متغير يتم صنعه عند إنشاء الكتلة. أنت لا تخصص للأصل pathToFile المتغير الذي أعلنته خارج الكتلة.

يمكنك استخدام ال __block الكلمة الرئيسية للسماح للكتلة بتعيين هذا المتغير ، لكنني لا أعتقد أن هذا سيساعد بسبب beginSheetModalForWindow:completionHandler: لا تمنع. (لا يذكر الوثائق هذا ، ولكن لا يوجد سبب لحظر الطريقة ، ويمكنك التحقق من تسجيله غير ذلك.) تعود الرسالة على الفور ، بينما لا تزال اللوحة قيد التشغيل.

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

كل ما تفعله به pathToFile يجب أن يكون إما في الكتلة نفسها ، أو بطريقة ما (أخذ NSURL * حجة) أن الكتلة يمكن أن تستدعي.

نصائح أخرى

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

NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginSheetModalForWindow:window completionHandler:nil];
NSInteger result = [openPanel runModal];
NSURL *url = nil;
if (result == NSFileHandlingPanelOKButton) 
{
    url = [openPanel URL];
}
[NSApp endSheet:openPanel];

يبدو أنه يشبه الترميز السحري الأسود ولكنه يعمل.

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