Abpeoplepickernavigationaler - قم بإزالة زر "إلغاء" دون استخدام الأساليب/الخصائص الخاصة؟

StackOverflow https://stackoverflow.com/questions/1611499

سؤال

أنا أستخدم AbpeoplepickernavigationController ، فئة فرعية من UinavigationController ، وفي السياق أستخدمه زر NAV الافتراضي للجانب الأيمن ، "إلغاء" ، لا معنى له. لا يمكنني إيجاد طريقة لتعطيلها أو إخفائها ، وأي طريقة تستخدم يجب أن تكون قابلة للعلاقات العامة والمتجر. قد يكون التخلص من شريط NAV بالكامل (Picker.NavigationBarHidden = نعم ؛) خيارًا إلا أنه بعد العودة إلى قائمة جهات الاتصال التي يعود إليها شريط NAV. تصنيف AbpeoplePickerNavigationController واعتراض ViewWillAppear لمحاولة عدم عمل الزر "إلغاء". [Picker SetallowsCancel: لا] ؛ هل يعمل ولكنه غير موثق ، لذلك أتوقع أن يمرر أبدًا الموافقة.

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

المحلول 3

لا توجد إجابة على هذا - اكتب منتقي شخص جديد إذا لم تتمكن من العيش مع الإلغاء.

نصائح أخرى

هذا

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(0.0f,0.0f,0.0f,0.0f)]; 
  UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom]; 
  //UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction)]; 
  [viewController.navigationItem setRightBarButtonItem:btn animated:NO]; 
  [btn release]; 
  [custom release]; 
}

يعمل بشكل مثالي!

الأمثلة هنا باستخدام طريقة المندوب NavigationController: WillShowViewController: الرسوم المتحركة: هل تعمل ، ولكن قد تكون الحالة التي ترغب في إضافة عنصر التنقل الخاص بك في وحدات التحكم الخاصة بك ، وستقوم الخيارات المعطاة بإزالة أي شيء يمكنك تعيينه في وحدات التحكم الخاصة بك . فيما يلي رمز استخدمته بنجاح للحصول على هذا الخيار للعمل بشكل جيد:

- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated {

    // Here we want to remove the 'Cancel' button, but only if we're showing
    // either of the ABPeoplePickerNavigationController's top two controllers
    if ([navigationController.viewControllers indexOfObject:viewController] <= 1) {

        viewController.navigationItem.rightBarButtonItem = nil;
    }
}

لاحظ أن هناك وحدات تحكم عرضين في مكدس وحدة تحكم التنقل ، والآخر لمجموعات الاتصال والآخر لقائمة الاتصال. هذا هو السبب في أننا لا نستطيع فقط التحقق من Fi the ViewController هو وحدة تحكم View Top View Top Controller.

يمكنك تحقيق هذه النتيجة في التصفح من خلال وجهات نظر المنتقط. مجرد ممل قليلا ...

لم أجربها بعد ، لكنني أعتقد أن Uby تقول لتكرار من خلال الرؤية الفرعية للمنتقي حتى تجد واحدة هي iskindofclass: [uibarbuttonitem class] وبعد ذلك يمكنك تغيير خاصية عنوانها. قد يكون أيضًا في مجموعة "البند" لـ NavigationBar.

قم بتعيين مندوب على جهاز التحكم PeoplePickerController. في فئة المندوبين ، لديك طريقة المندوب هذه.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
 UIView *pCustomView = [[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)];
 UIBarButtonItem *pBtn = [[UIBarButtonItem alloc] initWithCustomView:pCustomView];
 [viewController.navigationItem setRightBarButtonItem:pBtn animated:NO];
 [pBtn release];
 [pCustomView release];
}

تأكد من تعيين المندوب لكائن Picker (وليس PeoplePickerDelegate ، فقط المندوب) على الفصل الذي ينفذ الطريقة التالية:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)];
UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom];
[viewController.navigationItem setRightBarButtonItem:btn animated:NO];
[btn release];
[custom release];
} 

إنه يعمل بشكل جيد ولكن في iOS 4 هناك شيء آخر. عندما أعود إلى تطبيقي باستخدام ميزة تبديل التطبيق السريع ، يظهر زر "إلغاء" مرة أخرى.

طريقة

- (void)navigationController:(UINavigationController *)navigationController  
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated

لا يتم استدعاؤه. لذلك صنعت هذا:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    id topView = pickerControllerDelegate.peoplePicker.topViewController;
    topView.navigationItem.rightBarButtonItem = nil;
}

إنه يعمل بشكل جيد.

وفقًا لروسيل ب ، يمكنك فقط الكتابة فوقك ViewDidapper

هذا عمل بالنسبة لي:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UINavigationItem *item = (UINavigationItem *)[self.navigationBar.items lastObject];
    item.rightBarButtonItems = [[NSArray alloc] init];

    item.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addPerson)];
}

تحرير: انظر التعليقات أدناه. هذا هو الآن توضيح لما لا يفعله.

حاولت الحصول على السلوك المطلوب مع واجهة برمجة التطبيقات العامة من خلال التصنيف الفرعي AbpeoplePickerNavigationScontroller والاعتراض على جميع الأحداث التي تغير عرض وحدة تحكم عرض الملاحة الحالية. ثم يمكن للمرء فقط التنقل في العرض الهرمي وتطهير جميع الأزرار غير المرغوب فيها.

يمكنك التنقل في التسلسل الهرمي للعرض من مندوب ، لكنك لست مطلعا على الأحداث التي تغير حالة العرض ... مما يجعل من الصعب قتل زر الإلغاء وجعله ملتصقًا.

هذا الرمز نوعا من عملت بالنسبة لي (ملاحظة: إنها تقتل جميع الأزرار اليمنى):

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self killCancelButton];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [super pushViewController:viewController animated:animated];
    [self killCancelButton];
}

- (UIViewController*)popViewControllerAnimated:(BOOL)animated {
    UIViewController *result = [super popViewControllerAnimated:animated];
    [self killCancelButton];
    return result;
}

- (void)killCancelButton {
    for (NSUInteger itemIdx = 0; itemIdx < self.navigationBar.items.count; itemIdx++) {
        UINavigationItem *item = [self.navigationBar.items objectAtIndex:itemIdx];
        item.rightBarButtonItems = [[NSArray alloc] init];
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top