سؤال

الإعداد الخاص بي:

في تطبيق 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/nsoperation_class/reference.html

قد يكون هذا أسهل بالنسبة لك للاستخدام: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" ، تقوم بالفعل بإصدار الكائن وكذلك إزالته من نظرته.

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