استبدل uibarbuttonitem مع UiActivityIndicatorView لا يعمل
-
28-09-2019 - |
سؤال
أرغب في استبدال زر التحديث بمؤشر النشاط عندما يضغط المستخدم على زر التحديث وبعد تحديث TableView ، أريد تغييره مرة أخرى إلى زر التحديث. ولكن عندما أضغط على زر التحديث ، لم يتغير إلى مؤشر النشاط ولكن يتم تمييز زر التحديث حتى يتم إعادة تحميل البيانات.
الرمز كما هو موضح أدناه. هل فاتني شيء؟
-(void) reloadNewsStarted{
UIActivityIndicatorView *activityIndicatorRightBarItem = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
[activityIndicatorRightBarItem startAnimating];
UIBarButtonItem *activityItem = [[UIBarButtonItem alloc] initWithCustomView:activityIndicatorRightBarItem];
[activityIndicatorRightBarItem release];
self.navigationItem.rightBarButtonItem = activityItem;
[activityItem release];
[self reloadNewsEnded];
}
-(void) reloadNewsEnded {
//reload data process
UIBarButtonItem *reloadNewsBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(reloadNewsStarted)];
reloadNewsBtn.style = UIBarButtonItemStyleBordered;
self.navigationItem.rightBarButtonItem = reloadNewsBtn;
[reloadNewsBtn release]; }
المحلول
بدلا من الكتابة
[self reloadNewsEnded];
اكتب رجاءا
[NSThread detachNewThreadSelector:@selector(reloadNewsEnded) toTarget:self withObject:nil];
يبدأ هذا السطر مؤشر ترابط جديد في الخلفية ، لذا سيتم إجراء مؤشر النشاط وإعادة تحميل البيانات في وقت واحد في موضوعين.
نصائح أخرى
لماذا هذا الخط في نهاية reloadNewStarted
طريقة
[self reloadNewsEnded];
يبدو أن مجرد التراجع عن التغييرات على الزر؟ يجب أن تنتظر حتى يكتمل الإجراء قبل الاتصال به
لن يسري تغيير الزر حتى تستعيد حلقة التشغيل السيطرة من الكود الخاص بك. يبدو أن عملية إعادة التحميل الخاصة بك متزامنة وتمنع قائمة انتظار الحدث ، مما لن يسمح بحدوث ذلك. إذا استغرقت المعالجة الخاصة بك قدرًا ملحوظًا من الوقت ، فأنت بحاجة إلى استخدام خيط خلفية أو معالجة غير متزامنة على حلقة التشغيل الرئيسية (على سبيل المثال ، باستخدام NSURLConnection لإدارة مهمة الشبكة وعمليات الاتصال) حتى لا تحظر.