سؤال

يجب تطبيق يحتوي على UITableView.هذا UITableView يتم ملؤها من قبل NSMutableArray محتجزين (مثل العقارات) في appDelegate.يمكنك التفكير في هذه نافذة البريد الإلكتروني.وهو يسرد الرسائل في قائمة ثم subclassed UITableViewCell.عندما رسالة جديدة يظهر لدي كل رمز يتم فيها تنزيل الرسالة ، إضافة البيانات إلى appDelegate هو NSMutableArray الذي يحمل كافة الرسائل.هذا الكود يعمل بشكل جيد.

الآن بمجرد رسالة جديدة تم إضافتها إلى مجموعة ، أنا أحاول تحديث UITableView باستخدام التعليمات البرمجية التالية ، ومع ذلك - UITableView مندوب وظائف لا يسمى.

الشيء الغريب هو عندما انتقل بلدي UITableView صعودا وهبوطا ، مندوب أساليب أخيرا دعا القسم رؤوس تتغير (أنها تظهر الرسالة عد عن هذا القسم).يجب تجنبه تحديث في الوقت الحقيقي و ليس الانتظار لبلدي التمرير لتحريك التحديث ؟ أيضا, الخلية الجديدة لم وأضاف في القسم!!

الرجاء المساعدة!!

APPDELEGATE كود:

[self refreshMessagesDisplay]; //This is a call placed in the msg download method

-(void)refreshMessagesDisplay{
    [self performSelectorOnMainThread:@selector(performMessageDisplay) withObject:nil waitUntilDone:NO];
}

-(void)performMessageDisplay{
    [myMessagesView refresh];
}

UITableViewController كود:

-(void) refresh{
    iPhone_PNPAppDelegate *mainDelegate = (iPhone_PNPAppDelegate *)[[UIApplication sharedApplication] delegate];

    //self.messages is copied from appDelegate to get (old and) new messages.
    self.messages=mainDelegate.messages;

    //Some array manipulation takes place here.

    [theTable reloadData];
    [theTable setNeedsLayout];  //added out of desperation
    [theTable setNeedsDisplay];  //added out of desperation
}
هل كانت مفيدة؟

المحلول

كما التعقل الاختيار هل التحقق من أن theTable ليس النيل في تلك المرحلة ؟

نصائح أخرى

يمكنك محاولة وضع تأخير على reloadData الاتصال لدي مشكلة مماثلة عندما كنت أحاول الحصول على بلدي tableview إلى التحديث عند إعادة ترتيب خلايا, إلا أن التطبيق تحطمت إذا اتصلت reloadData أثناء ذلك.

لذا شيئا مثل هذا قد يكون من المفيد محاولة:

طريقة تحديث:

    - (void)refreshDisplay:(UITableView *)tableView {
    [tableView reloadData]; 
}

ثم نسميها (أقول) 0.5 تأخير الثانية:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5];

نأمل أن يعمل...

إذا كنت استدعاء reloadData من خلال ارسال طريقة للتأكد من تنفيذ ذلك على الانتظار الرئيسي.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) {

    // hard work/updating here

    // when finished ...
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [self.myTableView reloadData];
    }); 
});

..نفس طريقة النموذج:

-(void)updateDataInBackground {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) {

        // hard work/updating here

        // when finished ...
        [self reloadTable];
    });
}

-(void)reloadTable {
       dispatch_async(dispatch_get_main_queue(), ^(void) {
            [myTableView reloadData];
        }); 
}

هل حاولت تعيين نقطة توقف في طريقة تحديث فقط للتأكد من رسائل مجموعة الصحيحة المحتوى قبل استدعاء reloadData?

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