الحصول على عنوان URL من BeginSheetModalforWindow:
-
24-09-2019 - |
سؤال
أنا أستخدم 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];
يبدو أنه يشبه الترميز السحري الأسود ولكنه يعمل.