سؤال

هذا سؤال مبتدئ للغاية، وهذا شيء قمت به عدة مرات من قبل، ولكن هناك شيء أفتقده هذه المرة.

في ملف appdelegate.h الذي أعلن فيه NSArray وتعيينه كخاصية:

@interface AppDelegate : NSObject {
NSArray *lines;

}

@property(readwrite, retain) NSArray *lines;
@end

ثم في ملف appdelegate.m في طريقة awakefromnib أنا alloc ذلك:

lines = [[NSArray alloc] init];

ثم لدي طريقة تحدد صفيف الخطوط:

NSString *fileContents = [NSString stringWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/sometextfile.txt"] encoding:NSUTF8StringEncoding error:NULL];
lines = [fileContents componentsSeparatedByString:@"\n"];

لدي جهاز تحكم صفيف لا بد أن AppDelegate.self.lines ثم لدي عمود جدول مرتبط Array Controller.arrangedObjects. وبعد يمكنني التأكد من تحديث الصفيف (تم اختباره باستخدام NSLOG) ولكن لم تكن محتويات الجدول تحديثا (لا يزال فارغا).

هل هناك شيء واضح أنا في عداد المفقودين هنا؟

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

المحلول

لا تحتاج إلى مصدر بيانات إذا كنت تستخدم الارتباطات. واحد او الاخر.

لدي وحدة تحكم صفيف ملزمة ب "AppDelegate.self.line" ...

لماذا self?

property (قراءة كتابة، الاحتفاظ) NSARRAY * خطوط؛

لا، استخدم copy هنا. خلاف ذلك، ستجد نفسك تحتفظ بمجموعة متغيرة لشخص آخر، والتي سوف يتحول إليها بعد ذلك. ثم "سيتم تغيير صفيف" الخاص بك دون معرفة ذلك.

ثم لدي طريقة تحدد صفيف الخطوط:

lines = [fileContents componentsSeparatedByString:@"\n"];

هذا هو السبب في أن الجدول لا يظهر أي شيء. أنت لا تمر بإمكانك، فأنت في الوصول إلى متغير المثيل مباشرة. لا تتسبب الوصول المتغير المثيل المباشر إلى إشعارات KVO، لذا فإن وحدة تحكم الصفيف لا تجد أبدا عن التغيير.

والأسوأ من ذلك، يمكنك تسريب الصفيف القديم (نظرا لأنك تقوم ببساطة بتعيينه دون إبرازه) وإلغاء الاحتفاظ بهذه الصفيف الجديد. نظرا لأنك لا تحتفظ بالمجموعة الجديدة، فإن هذا المثيل سوف يحمل كائنا قريبا. يتم الاحتفاظ التلقائي من قبل setLines: الطريقة، التي يتم استدعاؤها فقط عند تسميتها.

تحتاج إلى الذهاب عبر الممتلكات:

self.lines = [fileContents componentsSeparatedByString:@"\n"];

الوصول إلى العقار هو رسالة ملحق ضمنية، لذلك يحتفظ كل من الصفيف (أو نسخه، بمجرد تصحيح @property كما اقترحت أعلاه) ووظائف إشعارات KVO.

نصائح أخرى

عندما تقول أن لديك ترتيبات مرتبطة بالعمود هل تعني أنك تقوم بتعيين DataSource TableView؟ إذا لم يكن لديك لضبط DatableView DataSource إلى صفيف الخطوط

قد ترغب في ذلك قراءة من خلال هذا, ، لقد حصلت على بعض المخططات والشروحات الجيدة. ما يقوله Ennuikiller هو الصحيح، وأعتقد أنه مشكلة في مصدر البيانات الخاص بك. يتم ذلك عن طريق الاتصال

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