عرض فرعي عند التحميل ، مخفي عند الانتهاء
-
21-09-2019 - |
سؤال
الإعداد الخاص بي:
في تطبيق iPhone الخاص بي ، لدي طريقة عرض تحميل (وهي عبارة عن عرض uiimageview نفسه) واثنين من وجهات النظر الفرعية في عرض التحميل ، و uiindicatorview و uilabel. لمشاهدته ، أسمي [self.view addSubview:loadingView]
الطريقة ، ولإخفائها أستخدمها [loadingView removeFromSuperView]
.
في تطبيقي لتحديث بياناتي لدي الطريقة -(void)refreshData
. في هذه الطريقة ، أعرض العرض الفرعي ، وقم بتنزيل بعض البيانات الناتجة عن منشور HTTP ، و START و NSXMLPARSER مع هذه البيانات.
عندما يصل NSXMLParser إلى العنصر الأخير منه -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
الطريقة ، ثم إخفاء الرؤية الفرعية (باستخدام الطريقة أعلاه).
لاستدعاء refreshData
الطريقة لدي زر تحديث في شريط التنقل الخاص بي:
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshData)];
مشكلتي:
عندما أقوم بالنقر فوق زر التحديث ، لا تظهر الرؤية الفرعية. يطلق على الأساليب لأنه في السجل أرى بوضوح:
عرض عرض التحميل
حفنة من الخطوط المعروضة أثناء عملية التحميل (مجموع 15 ثانية)
إخفاء عرض التحميل
أعلم أيضًا أن أساليبي تعمل لأنه عندما أتعلق بالمرافرة التي تخفي عرض العرض ، لا يزال يتم رؤيته حتى أغلق التطبيق
أيه أفكار؟
المحلول
إذا كنت تقوم بالاختباء وعرضت كل شيء ضمن رد اتصال الحدث نفسه ، فلن تمنحه فرصة لتحديث واجهة المستخدم الرسومية بالفعل. إذا كان عملك سيستغرق الكثير من الوقت (مثل 15 ثانية) ، فيمكنك استخدام nsoperation للقيام بالعملية والعمل عند حدوث رد الاتصال النهائي ثم إخفاء عرضك.
قد يكون هذا أسهل بالنسبة لك للاستخدام:http://developer.apple.com/iphone/library/documentation/cocoa/reference/nsinvocationOperation_class/reference/reference.html#//apple_ref/occ/cl/nsinvocationOperation
عندما تريد تحديث واجهة المستخدم الرسومية ، تأكد من قيامك من الخيط الرئيسي وليس من الحدث في طريقة nsoperation:
يمكنك استخدام هذه الطريقة لتشغيل المحدد في الخيط الرئيسي.http://developer.apple.com/iphone/library/documentation/cocoa/reference/foundation/classes/nsobject_class/reference/Reference.html#//apple_ref/occ/instm/nsobjectontonctoronmentonthread:withobject:
للحصول على إجابة أفضل: في الكود الذي يقوم بالتحميل الذي كان يقوم بالعمل للحصول على البيانات:
// Code to show loading gui
[[[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(refreshData) object:nil] autorelease];
ثم من أجل RefreshData:
- (void) refreshData {
// do the work
[self performSelectorOnMainThread:@selector(doneRefresing)
withObject:nil waitUntilDone:NO] ;
}
نصائح أخرى
من المستندات:
إذا لم تكن الرؤية الإشرافية للمستقبل لا شيء ، فإن هذه الطريقة تطلق المتلقي. إذا كنت تخطط لإعادة استخدام العرض ، فتأكد من الاحتفاظ بها قبل الاتصال بهذه الطريقة وتأكد من إطلاقها حسب الاقتضاء عند الانتهاء من ذلك أو بعد إضافتها إلى التسلسل الهرمي الآخر.
لذلك باستخدام "removeFromSuperView" ، تقوم بالفعل بإصدار الكائن وكذلك إزالته من نظرته.