سؤال

لقد أضفت تحديث Uibarbuttonitem إلى شريط التنقل الخاص بي على تطبيق iPhone الخاص بي. عندما ينص الطرف المستخدم على الزر، فأنا أرغب في تغيير زر التحديث إلى مؤشر النشاط المتحرك، وبمجرد تشغيل العملية (في هذه الحالة، قم بالتنزيل) باستمرار مؤشر النشاط مرة أخرى إلى زر التحديث.

لقد أضفت زر التحديث باستخدام IB. ثم على الزر، انقر فوق "إنشاء مؤشر نشاط جديد" والحفاظ على مؤشر إلى زر التحديث الأصلي. مثل ذلك:

refreshButtonItem = self.navigationItem.leftBarButtonItem;
if (activityButtonItem == nil)
{
    activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20,20)];
    activityButtonItem = [[UIBarButtonItem alloc]initWithCustomView:activityIndicator];

}
self.navigationItem.leftBarButtonItem = activityButtonItem;
[activityIndicator startAnimating];

حتى الان جيدة جدا. المشكلة هي أنه عند انتهاء التنزيل الخاص بي وأحاول إعادة إضافة زر التحديث (باستخدام ما يلي):

[activityIndicator stopAnimating];
self.navigationItem.leftBarButtonItem = refreshButtonItem;

أحصل على الخطأ التالية:
uibarbuttonitem الاحتفاظ]: الرسالة المرسلة إلى المثيل المعامل

أنا لا أتصل بالافراج عن صراحة.

أ) متى / أين يتم إلغاء تخصيص هذا

ب) هل هناك طريقة أفضل لتحقيق ما أبحث عنه؟

هل كانت مفيدة؟

المحلول

عند تعيين ActivityButtonitem إلى LeftBarbuttonitem، فإن العنصر الذي يستخدمه LeftBarbuttonitem تستخدم للإشارة إليه. يتم تطبيق اليسار (وجميع الخصائص مع خيار الاحتفاظ) بالمثل هذا:

- (void)leftBarButtonItem:(UIBarButtonItem *)newItem {
  if (newItem != self.leftBarButtonItem) {
    [self.leftBarButtonItem release];
    leftBarButtonItem = [newItem retain];
  }
}

إذا كنت ترغب في استخدام RefreshButtonItem بعد إعادة تعيين اليسار الأيسر، فقم بتغيير السطر الأول إلى:

refreshButtonItem = [self.navigationItem.leftBarButtonItem retain];

نصائح أخرى

منذ iOS 5 مع إدخال القوس، لم تعد بحاجة إلى الاحتفاظ بها.

يمكن الحصول على الحل كما chagreen الموضح بينما يمكن تخزين RefreshButtonitem كخاصية فئة، بالإضافة إلى loadingbutton و loadingview.

في واجهةك تعلن:

@property (strong, nonatomic) UIBarButtonItem *refreshButton;
@property (strong, nonatomic) UIBarButtonItem *loadingButton;
@property (strong, nonatomic) UIActivityIndicatorView *loadingView;

Init LoadingButton و LoadingView في طريقة تحميل ViewDIDID الخاص بك:

self.loadingView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
self.loadingButton = [[UIBarButtonItem alloc] initWithCustomView:self.loadingView];

ثم لإظهار سبينر التحميل يمكنك ببساطة القيام به:

 // Shows loading button
- (void)showLoadingView {

    // Keep reference to right bar button
    if (self.navigationItem.rightBarButtonItem) {
        self.refreshButton = self.navigationItem.rightBarButtonItem;
    }

    // Start animating and assign loading button to right bar button
    [self.loadingView startAnimating];
    self.navigationItem.rightBarButtonItem = self.loadingButton;
}

وإخفاء:

 // Hides loading button
- (void)hideLoadingView {
    [self.loadingView stopAnimating];
    self.navigationItem.rightBarButtonItem = self.refreshButton;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top