سؤال

باستخدام عرض تقسيم على iPad ، لدي الرمز التالي:

- (void) splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc {
  barButtonItem.title = @"Categories";
  NSMutableArray *items = [[toolbar items] mutableCopy];
  [items insertObject:barButtonItem atIndex:0];
  [toolbar setItems:items animated:YES];
  [items release];
  self.popoverController = pc;
}

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

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

المحلول

عند عرض SplitViewController Popover ، سيتم استدعاء الطريقة أدناه. فقط تحقق إذا لم يكن لا شيء ، ثم رفضه :)

- (void)splitViewController:(UISplitViewController*)svc popoverController:(UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController{
  if ([pc isPopoverVisible]) {
     [pc dismissPopoverAnimated:YES];
  }
}

نصائح أخرى

يقول HIG من Apple إنه لا ينبغي أن يكون هناك زر إلغاء صريح داخل البوبوفر ، ولكن للقيام بما تطلبه ، لديك خياران.

1) نشر NSNotification

أو

2) انتقل لأسفل في عرضي التسلسل الهرمي حتى يكون لديك مثيل Popover

1) في أي عرض تقوم بتقديم البوبوفر ، في طريقة ViewDidload:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissThePopover) name:@"popoverShouldDismiss" object:nil];

قم بإنشاء طريقة تسمى "DisissThePopover" وفي طريقة Dealloc ، remostobserver

-(void)dismissThePopover {
    [self.popoverController dismissPopoverAnimated:YES];
}

-(void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

في زر "رفض" popovercontroller الخاص بك ، أدخل هذا السطر:

[[NSNotificationCenter defaultCenter] postNotificationName:@"popoverShouldDismiss" object:nil];

إن القيام بذلك يرسل إشعارًا إلى التطبيق ، ولأنك قمت بتسجيل وحدة التحكم في العرض الأخرى للاستماع إليه ، كلما رأى أن الإخطار يدعو إلى المحدد الذي تحدده ، في هذه الحالة ، رفضها.

2) انتقل لأسفل في التسلسل الهرمي الخاص بك للعثور على self.popovercontroller

تحقق من ذلك ، سيكون لك مختلفًا ، بالتأكيد ، لكن الفكرة العامة هي نفسها. ابدأ من AppDelegate الخاص بك ، انتقل إلى أول ViewController ، انتقل إلى عمليات الرؤية الفرعية حتى تصل إلى كائن Self.popoverController.

MyAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
//appDelegate instance, in this case it's the .m file for your ApplicationDelegate

UISplitViewController *svc = appDelegate.splitViewController;
//In this case the first view inside the appDelegate is a SplitView, svc

UINavigationController *navc = [[svc viewControllers]objectAtIndex:0];
//a navigationController is at index:0 in the SplitView hierarchy. DetailView is at index:1

NSArray *vcs = [navc viewControllers];
//vcs is the array of different viewcontrollers inside the Navigation stack for nvc

iPadRootViewController *rootView = [vcs objectAtIndex:0];
//declare the rootView, which is the .m file that is at index:0 of the view array

UIPopoverController *pc = [rootView popoverController];
//HERE WE GO!!! popoverController is a property of iPadRootViewController's instance rootView, hereby referred to as pc.

[pc dismissPopoverAnimated:YES];
//bye bye, popoverController!

أتمنى أن يساعدك هذا

هذا أسهل كثيرًا لأن popovercontroller هو خاصية. يجعل من السهل الإشارة.

if ([self.popoverController isPopoverVisible]) {
    //using the setters and getters "goes thru the proper channels" when accessing objects
    [self.popoverController dismissPopoverAnimated:YES];
} else {
    UIPopoverController *pc = [[UIPopoverController alloc] initWithContentViewController:YOUR_VIEW_CONTROLLER];
    self.popoverController = pc;
    [pc release];

    //get the button instance you set on the toolbar
    UIBarButtonItem *categoryButton = [[toolbar items] objectAtIndex:0];
    [self.popoverController presentPopoverFromBarButtonItem:categoryButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

لقد أدركت للتو أنك تشير إلى الكود داخل طريقة المندوب لعرض ViewController في الفهرس: 0 من SplitView الخاص بك. لا تنطبق هذه الإجابة بالضرورة على ذلك ، ولكنها تنطبق على أي وقت آخر يمكنك الوصول إليه وإنشاء popovercontrollers على iPad. دون التحقق مما إذا كان البوبوفر مرئيًا أولاً ، ستقوم إما بالتعطل ، أو تفتح العديد من البوبوف.

شكرا على وقتك.

يمكنك تجربة أدناه

if(![popoverController isPopoverVisible]){
   // Show popover
}
else{
   // close popover
   [popoverController dismissPopoverAnimated:YES];
}

إذا كنت تستخدم الافتراضي UISplitViewController الإعداد ، ثم زر شريط التنقل الذي يتم إنشاؤه يعرض popover الخاص بك RootViewController.

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

- (void) viewWillAppear:(BOOL)animated {
  if ([self.popover isPopOverVisible]) {
    [self.popover dismissPopoverAnimated:YES];
  }
  [super viewWillAppear:YES];
}

الرمز الذي اعتدت عليه لإظهار البوبوفر في RootViewController.m:

- (IBAction) addCategory:(id)sender {
  AddCategoryViewController *content = [[AddCategoryViewController alloc] init];
  UIPopoverController *aPopover = [[UIPopoverController alloc]
                                   initWithContentViewController:content];

  aPopover.delegate = self;

  // Store the popover in a custom property for later use.
  self.addCategoryPopover = aPopover;
  addCategoryPopover.delegate = self;
  [aPopover release];
  [content release];

  [addCategoryPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}

هذا اعتدت أن أحاول ورفضه من فصل آخر:

-(IBAction)saveAddCategory:(id)sender {
  rootViewController = [[RootViewController alloc] init];
  [rootViewController dismissPopover];
}

لي dismissPopover تشبه الوظيفة:

- (void) dismissPopover {
  if ([self.addCategoryPopover isPopoverVisible]) {
    [self.addCategoryPopover dismissPopoverAnimated:YES];
  }
  if (addCategoryPopover.popoverVisible == YES) {
    [addCategoryPopover dismissPopoverAnimated:YES];
  }
}

نعم ، يمكنك تعيين ملف modalPresentationStyle كالتالي:

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