Всплывающее окно без размера

#objective-c #size #uipopovercontroller #popover

#objective-c #размер #uipopovercontroller #всплывающее окно

Вопрос:

Я создал класс всплывающих окон, который я мог бы легко вызывать для базовых всплывающих окон — вы предоставляете ему данные и устанавливаете размер, а он должен делать все остальное.

Это работало нормально до 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, он выдает «no size» — т. Е. У него есть граница всплывающего окна, но в нем вообще нет содержимого.

Когда setSize вызывается в viewWillAppear, viewDidAppear или что-то в этом роде (после viewDidLoad ), он фактически не устанавливает размер всплывающего окна.

Комментарии:

1. Использует ли это раскадровку или нет?

2. Вы уже пробовали [self.basicPickerPopover setPopoverContentSize:self.basicPicker.view.frame.size]; ? (перед представлением)

Ответ №1:

Наконец-то понял это.

Мне нужно было назначить переменные width / height после создания всплывающего окна, но перед его инициализацией.

Пересмотренный код ниже:

 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];