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