0

基本的なポップオーバーのために簡単に呼び出すことができるポップオーバー クラスを作成しました。データを指定してサイズを設定すれば、あとはクラスが実行するはずです。

これは iOS5 までは正常に機能していましたが、現在はポップオーバーが開きますが、境界線だけで、空白やコンテンツはまったくありません。

私は検索して検索しました。あなたが私の方法で投げることができるアイデアは素晴らしいでしょう.

@protocol BasicPickerDelegate
 - (void)basicPickerItemSelected:(NSMutableDictionary *)thisDic; 
@end


@interface BasicPickerController : UITableViewController {

 // data

 IBOutlet NSMutableArray *theData;

 // stuff to set 

 IBOutlet int myWidth;
 IBOutlet int myHeight;

 IBOutlet int myPopoverNum;

 // delegate
 id<BasicPickerDelegate> delegate;      

}

 @property (nonatomic, retain) IBOutlet NSMutableArray *theData;

 @property (nonatomic, assign) IBOutlet int myWidth; 
 @property (nonatomic, assign) IBOutlet int myHeight;
 @property (nonatomic, assign) IBOutlet int myPopoverNum;

 @property (nonatomic, assign) id<BasicPickerDelegate> delegate;

 - (void)setSize;
 - (void)checkData;

@end

次に、setSize 関数は viewDidLoad です

- (void)setSize {

    if (!myWidth || !myHeight) {

      NSLog(@"WIDTH AND HEIGHT NOT SET, SETTING DEFAULTS");
      myWidth = 100;
      myHeight = 100;

    }

    self.contentSizeForViewInPopover = CGSizeMake(myWidth, myHeight);
}

次に、次のように呼び出します。

- (IBAction)showBasicPopover:(id)sender {

    // Show Basic Popover - can be reused

    if (basicPicker != nil) {

        self.basicPicker = nil;
        [self.basicPicker release];

    }

    self.basicPicker = [[[BasicPickerController alloc] initWithStyle:UITableViewStylePlain] autorelease];

    basicPicker.delegate = self;

    self.basicPickerPopover = [[[UIPopoverController alloc] 
                                    initWithContentViewController:basicPicker] autorelease];      

    // Give popover the data it needs

    NSMutableDictionary *sizeDic = [self returnPopoverSize:[sender tag]];

    self.basicPicker.myHeight = [[sizeDic objectForKey:@"height"] intValue];
    self.basicPicker.myWidth = [[sizeDic objectForKey:@"width"] intValue];
    self.basicPicker.myPopoverNum = [sender tag];

    [basicPicker viewDidLoad];

    self.basicPicker.theData = [self returnPopoverData:[sender tag]];

    NSLog(@"giving popover dic (%d) with %d derps", [sender tag], [self.basicPicker.theData count]);

    // Set display settings and show popover

    [basicPicker viewWillAppear:YES];

    CGRect popoverRect = [self.view convertRect:[sender frame] 
                                       fromView:[sender superview]];

    [self.basicPickerPopover presentPopoverFromRect:popoverRect 
                                             inView:self.view 
                           permittedArrowDirections:UIPopoverArrowDirectionAny 
                                           animated:YES];

}

実行すると、WIDTH AND HEIGHT NOT SET, SETTIN DEFAULTSダイアログが表示されます。何らかの理由で、指定された値を読み取っていません。いくらかいじってはいますが、それらを読み取ることができたとしても、それらが有効であるとは思わず、それらを上書きします。

編集: 基本的に:

setSize が viewDidLoad で呼び出されると、幅と高さがわかりません。したがって、デフォルトを設定します。

setSize が viewDidLoad で呼び出されない場合、「サイズなし」になります。つまり、ポップオーバー ボーダーがありますが、コンテンツがまったくありません。

setSize が viewWillAppear、viewDidAppear、またはそのようなもの (viewDidLoad の後) で呼び出された場合、実際にはポップオーバーのサイズは設定されません。

4

1 に答える 1

0

最後にこれを理解しました。

ポップオーバーを作成した後、初期化するに、幅/高さの変数を割り当てる必要がありました。

以下の修正されたコード:

self.basicPicker = [[[BasicPickerController alloc] initWithStyle:UITableViewStylePlain] autorelease];

// Give popover the data it needs

basicPicker.delegate = self;

NSMutableDictionary *sizeDic = [self returnPopoverSize:[sender tag]];

self.basicPicker.myHeight = [[sizeDic objectForKey:@"height"] intValue];
self.basicPicker.myWidth = [[sizeDic objectForKey:@"width"] intValue];
self.basicPicker.myPopoverNum = [sender tag];

// Now init

self.basicPickerPopover = [[[UIPopoverController alloc] 
                            initWithContentViewController:basicPicker] autorelease];      

[basicPicker viewDidLoad];
于 2011-11-02T04:31:49.793 に答える