2012-04-25 27 views
6

UIPopupController ile oynamak istedim ve benim popover'ımın ne zaman işten çıktığını anlayamadığımı anladım. Benim adımlar:
1. XCode dan örnek oluşturun (Dosya -> Yeni Proje -> yardımcı programını Uygulama)
2. Ekleme MainViewController yılında UIPopoverControllerDelegatePopover algılamayı reddetme

#import "FlipsideViewController.h" 

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate,UIPopoverControllerDelegate> 

@property (strong, nonatomic) UIPopoverController *flipsidePopoverController; 

- (IBAction)showInfo:(id)sender; 

@end 
  1. MainViewController.h için:
 

    - (IBAction)showInfo:(id)sender 
    { 
     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
      FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil]; 
      controller.delegate = self; 
      controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
      [self presentModalViewController:controller animated:YES]; 
     } else { 
      if (!self.flipsidePopoverController) { 
       FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil]; 
       controller.delegate = self; 

       self.flipsidePopoverController.delegate = self 

       self.flipsidePopoverController = [[UIPopoverController alloc] initWithContentViewController:controller]; 
      } 
      if ([self.flipsidePopoverController isPopoverVisible]) { 
       [self.flipsidePopoverController dismissPopoverAnimated:YES]; 
      } else { 
       [self.flipsidePopoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
      } 
     } 
    } 

    -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController 
    { 
     NSLog(@"OLOLO"); 
    } 

Ancak bir yere dokunduğumda ve popover kaybolduğunda, Konsolda NSLog iletisi yok. Neyi yanlış yapıyorum?

+4

Sen temsilci ayarlıyorsunuz: 1.0 geri alfa ayarlayın ve yapmaya temsilci olarak kendimizi atamasını kaldırmak emin durmuyoruz ARC yapıyor o işi * ÖNCE ** popover denetleyicisini başlatırsınız. Başka bir deyişle, delegeyi –

+0

Gerçeği, gerçeği ayarladığınızda mevcut olmaz. Çok teşekkürler! –

cevap

2

MainViewController örneğinizi popletin temsilcisi olarak ayarladınız mı?

popover.delegate = self;

+0

FlipsideViewController * controller = [[FlipsideViewController alloc] initWithNibName: @ "FlipsideViewController" paketi: nil]; controller.delegate = self; –

+0

zaten oradaydı. –

+0

Bu nasıl pop-up yaratıyorsunuz?Daha fazla kod gönder –

15

kendine popover delegeleri ayarlamak ve ayrıca iki popover delegeler yani kullanabilirsiniz (kod boyunca popover oluşturmak varsa): -

/* Called on the delegate when the popover controller will dismiss the popover. Return NO to prevent the dismissal of the view. 
*/ 
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController; 

/* Called on the delegate when the user has taken action to dismiss the popover. This is not called when -dismissPopoverAnimated: is called directly. 
*/ 
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController; 
+1

didDismiss işlevinin yalnızca, popover dışa doğru bir dokunuş gibi kendisini reddettiğinde çağrıldığını unutmayın. Kendi kodunuzla (örneğin, bir tuşa basarak) işten çıkarırsanız, o zaman çağrılmaz. – CMash

4

önceki cevapları kullanarak sürmüştür Hedefe ulaşmak için tek mantıklı yol gibi görünen UIPopoverControllerDelegate. Pratik bir örnek eklemenin iyi olacağını düşündüm, çünkü başınızı döndürmek en basit şey değil. o hedef görünümü kumandam popover içerik boyutu var, film şeridindeki sizin popover

  1. Tel kadar yapılandırın: işte adımlardır, ben popover görünür iken arka plan görünümü bulanık istedi - My gereksinimi basitti Öznitellikler.

  2. .h dosyası açıp böyle bir şey yaparak bir UIPopoverControllerDelegate kaynak görünümü denetleyicisi yap:

    @interface MyController : UIViewController <UIPopoverControllerDelegate> 
    
  3. Geçersiz kıl prepareForSegue, popover için temsilci olarak kaynak görünümü denetleyicisi atamak ve sonra alfa ayarlamak segue hedef sunar hemen önce 0.5:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
        UIStoryboardPopoverSegue* popover = (UIStoryboardPopoverSegue*)segue; 
        popover.popoverController.delegate = self; 
        self.view.alpha = 0.5; 
    } 
    
  4. popover temsilci yöntemi popoverControllerDidDismissPopover uygulanması. *

    -(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
        self.view.alpha = 1.0; 
        popoverController.delegate = nil; 
    } 
    
+1

didDismiss işlevinin yalnızca, popover dışa doğru bir dokunuş gibi kendisini reddettiğinde çağrıldığını unutmayın. Kendi kodunuzla (örneğin, bir tuşa basarak) işten çıkarırsanız, o zaman çağrılmaz. – CMash

0
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
UIStoryboardPopoverSegue *popoverSegue; 
popoverSegue = (UIStoryboardPopoverSegue *)segue; 
popoverController = popoverSegue.popoverController; 
pCVisible = YES; 
[[segue destinationViewController] setDelegate:self]; 
} 

- (void) setDataFromPopover { 
    if (pCVisible) { 
    [popoverController dismissPopoverAnimated:YES]; // THIS IS KEY! this is where the popover is dismissed, not in the popover itself 
    } 
} 

Ve

//TableViewController.m 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:  (NSIndexPath *)indexPath 
{ 
    //variable = whatever 

OtherViewController *initialView; 
initialView=(OtherViewController *)self.delegate; 
initialView.theLabel.text = variable; 
[initialView setDataFromPopover]; 
} 
İlgili konular