كيف يمكنني إنشاء واجهة رئيسية تفصيلية باستخدام البيانات الأساسية وكيان مجرد؟

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

سؤال

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

لدي تطبيق يستند إلى مستند البيانات الأساسية.يتضمن النموذج صفحة كيان مجردة، والعديد من العناصر الفرعية الملموسة للصفحة.تحتوي جميع الصفحات على بعض السمات المشتركة (مثل "الاسم") ويتم تحديد تلك السمات في الصفحة.ومن الواضح أن الكيانات الفرعية لها سمات فريدة لها.

أريد أن تسمح الواجهة للمستخدم برؤية جميع أنواع الصفحات في القائمة الرئيسية (NSTableView).عند تحديد صفحة، تعتمد حقول التفاصيل التي يتم عرضها على نوع الصفحة.

إليك ما لدي الآن:

لدي ملف nib رئيسي، حيث يتم عرض القائمة الرئيسية، بالإضافة إلى جميع الحقول المشتركة في الصفحة.يوجد سن لكل نوع صفحة مع حقوله المحددة.يوجد NSArrayController الرئيسي في ملف nib الرئيسي، والذي يقوم بملء NSTableView.يوجد أيضًا NSArrayController في كل من السنون الخاصة بالصفحة حتى أتمكن من ربط حقول التفاصيل بسمات التحديد الحالي.تم تكوين جميع وحدات التحكم NSArrayControllers الخاصة بي بشكل متطابق، وقد ربطتها جميعًا بنفس ManageObjectContext ونفس SelectionIndexes.

أنا أستخدم طريقة آرون هيليجاس لتبديل العرض التي وصفها في كتابه عن الكاكاو.لذلك قمت بالتسجيل في NSTableViewSelectionDidChangeNotifications، وعندما أتلقى واحدة، فإنه يستدعي طريقة SwitchView:

يبحث SwitchView في الكائن المحدد حاليًا، ويتحقق من نوع الصفحة، ويتبادل في ملف nib المناسب وفقًا لطريقة Hillegass.

كل شيء يعمل بشكل جيد إذا قمت بإضافة صفحات من نوع واحد فقط، ولكن بمجرد إضافة صفحة من نوع آخر، يظهر لي هذا الخطأ:

خطأ في تعيين قيمة فهارس تحديد المسار الرئيسي للكائن (من كيان الكائن المنضم:الصفحة، عدد الكائنات المحددة:1):[القيمة لمفتاح غير محدد:]:الكيان NoColPage ليس متوافقًا مع ترميز القيمة الأساسية لجانب المفتاح.

الجزء الأخير من الخطأ منطقي:إنه عالق في محاولة عرض السن الخاطئ، لذا فهو يحاول الارتباط بالحقول غير الموجودة لهذا الكائن.

لقد أضفت حقل SelectionIndexes إلى MyDocument بحيث يمكن ربط جميع NSArrayControllers الخاصة بي بنفس المكان.لقد عانت من هذا لعدة أيام ولا أستطيع معرفة ذلك.أيه أفكار؟

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

ملاحظة:لا تعمل أداة Interface Builder لإنشاء واجهة رئيسية تفصيلية من كيان البيانات الأساسية كما أريد للكيانات المجردة.إنه يقوم فقط بإنشاء حقول للسمات الموجودة في الفوقية.

يحرر: أعتقد أن جوشوا على وشك تحقيق شيء ما، لكن لسوء الحظ، لم ينجح الأمر، فأنا أواجه نفس المشكلة باستمرار.في البداية كنت أواجه وقتًا عصيبًا لأنني لم أفهم ذلك -unbind:يتوقع ثابت سلسلة، وليس مسارًا رئيسيًا.

لقد جربت العديد من الاختلافات:حيث أتتبع وحدة التحكم في صفيف بنك الاستثمار القومي المعروض حاليًا؛حيث أتتبع نوع الصفحة المعروضة حاليًا وأقوم بإلغاء الربط/إعادة الربط فقط عندما أحاول عرض نوع صفحة مختلف...

إليك القسم ذي الصلة من التعليمات البرمجية.

-(void) displayViewController: (ManagingVC *) vc withClass:(NSString*) className {

//Try to end editing
NSWindow *w = [box window];
BOOL ended = [w makeFirstResponder:w];
if (!ended) {
    NSBeep();
    return;
}

//The Managing View Controller's NSArrayController
NSArrayController* vcAc = [vc arrCont];

//if the page we're trying to switch to is NOT the same type as the current page we're displaying
//if it is, do nothing.
if (![currPageDisplayed isEqual:className]) {

    //unbind the old view controller
    ManagingVC *oldvc = [viewControllers objectForKey:className];
    NSArrayController* oldsac = [oldvc arrCont];
    [oldsac unbind:@"selectionIndexes"];

    //bind the new view controller
    [vcAc bind:@"selectionIndexes" toObject:self withKeyPath:@"selectionIndexes" options:nil];
    currPageDisplayed = className;

    NSView *v = [vc view];

    //display the new view in an NSBox in the main nib
    [box setContentView:v];
}

}

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

المحلول 2

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

ما زلت أتبع نصيحة جوشوا بفك الارتباط قبل تبديل العرض، ولكن في الوقت الحالي أقوم فقط بربط حقول النص بـ arrayController.selection.whateverKey

نصائح أخرى

تكمن المشكلة في أنك تترك وحدات التحكم في صفيف حبيباتك مرتبطة بتحديد المستند، مما يجعلها تحاول (عندما يتغير التحديد) تمثيل العنصر المحدد.

جرب هذا:

  1. إزالة الارتباطات في المناقير.
  2. قبل إضافة طريقة عرض جديدة، قم بتوصيل روابطها في التعليمات البرمجية.
  3. قبل إزالة العرض القديم، افصل روابطه في التعليمات البرمجية.

هذا ينبغي أن يبقي كل شيء سعيدا.

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