يقوم parse.com PFQueryTableViewController بإرجاع نفس الكائن عدة مرات

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

  •  20-12-2019
  •  | 
  •  

سؤال

أحاول استخدامها (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object لتخصيص عرض PFObject البيانات في أ PFQueryTableViewController.لذلك أقوم ببناء بلدي PFQuery كائن في (PFQuery *)queryForTable في PFQueryTableViewController delegate من المفترض أن يحصل على كائنات متعددة في NSArray.

اعتقدت أنه من المفترض أن يقوم parse.com بالإرسال/الاتصال (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object مرة واحدة لكل كائن تم إرجاعه.ومع ذلك، أجد أنه يستمر في العودة نفس الكائن عدة مرات.

وهكذا، على سبيل المثال، بدلا من 3 كائنات مختلفة لمدة 3 مرات (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object يسمى، أحصل على نفس الكائن.لكنها ليست مشكلة في البيانات أو الاستعلام، لأنه في النهاية (PFQuery *)queryForTable ، فقط قبل

return query;

حاولت

[query findObjectsInBackgroundWithBlock:^(NSArray *resultsNow,NSError *error) {NSLog(@"We have the following: %@", resultsNow);}];
 sleep(5);

وهذا يوضح الأشياء الثلاثة التي تم الحصول عليها بشكل صحيح.كيف يتم ذلك بالضبط نفس الاستعلام عند التعامل معها PFQueryTableViewController الاتصال (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object 3 مرات، بدلاً من إرسال العناصر الثلاثة واحدًا تلو الآخر، يرسل العنصر الأول 3 مرات؟

ردًا على أسئلة وين، أضفت بعض الإجابات في التعليقات، ولكن يبدو أن ما يلي أيضًا ذو صلة:

- (PFObject *)objectAtIndex:(NSIndexPath *)indexPath {
// overridden, since we want to implement sections
if (indexPath.section < self.objects.count) {
    return [self.objects objectAtIndex:indexPath.section];
}

return nil;
}
هل كانت مفيدة؟

المحلول 2

بفضل سؤال وين، قمت بتسجيل الكائناتDidLoad:ووجدت أن الكائنات الثلاثة الصحيحة تم تحميلها، لذلك كان الأمر يتعلق بعدم تحميل PFQueryTableViewController بالتسلسل الصحيح في (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object.

على وجه الخصوص، كان من المفترض أن يكون رسم الخرائط موجودًا -(PFObject *)objectAtIndex:(NSIndexPath *)indexPath كما هو مبين في سؤالي.لكن عند النظر إلى الوثائق للمرة N، لاحظت فجأة أن اسم الطريقة يجب أن يكون بالفعل -(PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath.لا عجب أنه لم يتم استدعاؤه، وبدأ تعييني حيز التنفيذ، ومن ثم تم تمرير الكائن الخطأ إليه (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object.عندما قمت بتغييره إلى -(PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath, ، انتهت المشكلة!

كيف يمكن أن أحصل على اسم الطريقة الخاطئة؟لقد وجدت أنني قمت بنسخ مثال التعيين هذا من كود Anypic، لذا أعتقد أن parse.com قام بتغيير اسم الطريقة في وقت ما بعد كتابة Anypic؟يمكن لأي شخص التحقق من ذلك؟أنا أستخدم إطار التحليل 1.2.14

نصائح أخرى

كان لدي مشكلة مماثلة وما فعلته هو:

1- بدلًا من الاستخدام PFQueryTableViewController مجرد استخدام العادية UITableViewController.

2- تغيير الطريقة queryForTable:ل (void).

- (void)queryForTable {

3- حذف PFQueryTableViewالأساليب والتنفيذ DataSourceطُرق.

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    {
    }
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    }

يتصل [self queryForTable] في viewDidLoad بعد الإعلان عنه في ملف .h.

إذا كنت لا تستخدم الكتلة، فما عليك سوى الإنشاء NSArray property والسكان على queryForTable:

self.yourarray = [query findobjects];

إذا كنت تستخدم الكتلة، فقط تأكد من ملؤها NSArrayداخل الكتلة وإعادة تحميل عرض الطاولة.

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

    if (error) {
        // There was an error, do something with it.
    }
    else {
        self.yourArray = objects;
    }
    // Reload your tableView Data
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView reloadData];
    }); 
}];

هذه هي الطريقة التي عملت بها.نأمل أن يساعد.

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