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

StackOverflow https://stackoverflow.com/questions/3903264

سؤال

يبدو أن هذا يجب أن يكون سهلاً ولكن يجب أن أفتقد شيئًا. لدي تطبيق قائم على المستند. لقد قمت أيضًا ببناء XIB جديد يحتوي على NstableView وثلاثة أزرار عليها أعتزم عرض قائمة بالملفات السابقة. أتمنى أن يتم عرض XIB هذا بدلاً من نافذة المستند عند بدء التطبيق لأول مرة. بمجرد تحديد المستخدم ملفًا قديمًا أو يضرب الزر "الجديد" الذي أرغب في الانتقال إليه إلى نافذة المستند. هذا أمر شائع جدًا وقد رأيت يستخدم كثيرًا.

في محاولاتي للحصول على هذا العمل ، قمت بتعديل ملف project-info.plist وغيرت اسم قاعدة ملف NIB الرئيسية من MyDocument إلى اسم التحديد XIB الخاص بي. يؤدي هذا إلى عرض التطبيق نافذة التحديد بدلاً من نافذة MyDocument. يبدو أنه لا توجد مشكلة حتى هذه النقطة.

في نافذة الاختيار الخاصة بي ، قمت بإعداد عرض الجدول الخاص بي ووحدة تحكم صفيف ووحدة تحكم نافذة مخصصة فقط لهذا XIB. لقد قمت بتعيين مالك الملف على وحدة تحكم النافذة الجديدة وربط خاصية نافذة وحدة تحكم النافذة على النافذة وخاصية مندوب النافذة إلى مالك الملف وكذلك الأزرار "SELECT" و "Cancel" و "New". لا شيء مرتبط بـ nsapplication. لكن الشيء الغريب هو عندما أقوم بتشغيل هذا التطبيق ، يبدو أنه يريد توصيل وحدات التحكم هذه بـ nsapplication مع الخطأ (نفسه بالنسبة للزرين الآخرين):

لا يمكن توصيل الإجراء selectbutton: لاستهداف NSAPPlication

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

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

أي مساعدة يحظى بتقدير كبير. روب

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

المحلول

يعد الإعداد في IB لفئة مالك الملف من NIB استشاريًا فقط ؛ يتيح لـ IB إظهار المنافذ والإجراءات التي توفرها مثيلات تلك الفئة فقط. لا ينفذ أن مالك الملف سيكون مثيلًا لتلك الفئة ، لأن مالك الملف ليس جزءًا من NIB.

مالك الملف هو الكائن الذي يقوم بتحميل NIB. هذا يعني بالضرورة أنه خارج المنقار ، ولا يوجد شيء في المنقار يحدد أي شيء عنه. في حالة MainMenu NIB ، فإن مالك ملفه - الكائن الذي يقوم بتحميل NIB MainMenu - هو مثيل NSApplication. لذا ، كل ما قمت بتوصيله بمالك الملف في NIB MainMenu ، فقد قمت بتوصيل كائن التطبيق ، على الرغم من أنك أخبرت IB أنه لن يكون التطبيق.

إن التطبيق هو مالك MainMenu Nib - الذي لا يتجاوز ما تخبره IB - ليس هو الخطأ. التطبيق هو دائماً صاحب Mainmenu NIB. هذا طبيعي وصحيح ؛ لا يمكنك تغييره ، ولا ينبغي أن تحاول تغييره ، ولا تحتاج إلى تغييره.

الخلل ، باختصار ، هو أنك تستخدم NIB واحد لأغراض مختلفة للغاية.

يجب أن تدع Mainmenu Nib يكون ذلك بمفرده-تحديد MainMenu فقط ، وحكم مراقبة المستندات المخصصة (سأصل إلى ذلك في لحظة) ، ومندوب التطبيق الخاص بك-ونقل نافذة الوثائق السابقة إلى NIB منفصلة ، مملوكة بواسطة وحدة تحكم نافذة الوثيقة السابقة. من أجل الحصول على وحدة تحكم النافذة تكون مالك NIB هذا ، تحتاج إلى تحميل وحدة تحكم النافذة. يجب أن تفعل ذلك في الكود - لا يمكنك إعداد ذلك في IB أو في Plist.

في مندوب التطبيق الخاص بك ، قم بتثبيت وحدة تحكم النافذة وتمتلكها. يبدو أنك صنعت فئة فرعية مخصصة لـ NswindowController ، بحيث يمكنك تجاوزها init لجعلها ترسل نفسها initWithWindowNibName: رسالة لتحميل وامتلاك NIB. ثم ، فقط استخدم alloc و init لإنشاء وحدة تحكم النافذة من مندوب التطبيق.

سيتخلص ذلك من رسالة وحدة التحكم ، والتأكد من أن الأزرار مدمجة فعليًا إلى وحدة تحكم النافذة (لأنها مدمنة على مالك الملف ، والتي ستكون ، مع هذا التغيير ، وحدة تحكم النافذة).

اجعل مندوب التطبيق الخاص بك يستجيب ل applicationOpenUntitledFile: عن طريق إرسال وحدة تحكم النافذة showWindow: رسالة. سيؤدي ذلك إلى جعل نافذة الوثائق السابقة تظهر في أي وقت كان المستخدم عادة ما ينشئ مستندًا جديدًا.

إذا كنت ترغب في دعم الأساليب المعتادة لإنشاء المستندات (أي ، اسمح للوثيقة الجديدة بالعمل) ، ثم تنفيذ applicationDidFinishLaunching: و applicationShouldHandleReopen:hasVisibleWindows:, ، ليس applicationOpenUntitledFile:. تأكد من عدم وجود مستندات مفتوحة ، وإظهار نافذتك إذا كان هذا هو الحال.

يجب عليك أيضًا إنشاء فئة فرعية مخصصة لـ NSDocumentController وجعل وحدة تحكم المستندات الخاصة بك مثيلًا لذلك ، وفي تلك الفئة ، تنفذ addDocument: و removeDocument: لإعادة عرض نافذة الوثائق السابقة عند إغلاق آخر مستند مفتوح ، وإخفائه عند فتح مستند.

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