пытается исправить эту ошибку: не удалось найти сопоставленное изображение UIPickerViewFrameLeft-162-Popover.png - PullRequest
3 голосов
/ 20 ноября 2010

Я пытаюсь программно создать uiPickerView и добавить его в представление без использования конструктора интерфейса.Не поймите меня неправильно, мне нравится IB, но причина, по которой я хочу сделать это таким образом, заключается в том, что я пытаюсь создать объект, который я могу быстро подключить для создания всплывающих меню, используя UIPopoverViewController и множество различных subViews (такой как uiPickerView) как меню во всплывающем окне.Я уже сделал эту работу, построив меню в IB и инициализируя всплывающее окно с его ViewController, чтобы я знал, как это работает по большей части.

Я ввел соответствующий код ниже, и это дваошибки, которые я получаю при запуске: - «Не удалось найти сопоставленное изображение UIPickerViewFrameRight-162-Popover.png» - «Не удалось найти сопоставленное изображение UIPickerViewFrameLeft-162-Popover.png»

Я не знаю, чтоэти изображения, но я предполагаю, что они являются png-кодами окна выбора.

menu = [[UIPickerView alloc]initWithFrame:CGRectMake(0,100,162,162)];
  menu.delegate = self;
  menu.dataSource = self;

  [menu reloadAllComponents];
  [menu selectRow:0 inComponent:0 animated:YES];

  //Add the picker to the view
  [customViewController.view addSubview:menu];

  popView = [[UIPopoverController alloc] initWithContentViewController:customViewController] ;
  [popView setDelegate:self];
  CGRect pos = [rootView frame];
  [popView presentPopoverFromRect:CGRectMake(pos.origin.x,pos.origin.y,0,pos.size.height) 
         inView:displayView permittedArrowDirections:arrowDir animated:YES];

Теперь этот код будет вызывать сбой программы, если вы не удалите строку, где я пытаюсь добавить средство выбора в представление, вв какой момент я просто получаю пустой поповер.Так что я знаю, что именно сборщик вызывает эту проблему, однако я не знаю, как ее исправить.Я искал весь день, но все уроки онлайн на uipickers включают использование IB.Я предполагаю, что это действительно глупая ошибка, например, пропущенный импорт или что-то в этом роде, но если кто-нибудь скажет мне, что я делаю неправильно, это будет с благодарностью.

Также обратите внимание, что я следовал инструкциям о том, какнастроить dataSource и делегировать методы для UIPickerView, и я уверен, что они в порядке, но если вы хотите проверить, вот вам: Спасибо еще раз.

#import "PopUpMenuViewController.h"



@implementation PopUpMenuViewController

@synthesize menuType;
@synthesize data;
@synthesize popView;
@synthesize menu;
@synthesize customViewController;

#pragma mark -
#pragma mark UIPOPOVERCONTROLLER DELEGATE METHODS
#pragma mark -

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController{

 //Delegate this too the User of this class
 return TRUE;
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController{

 //Delegate this too the User of this class
}

#pragma mark -
#pragma mark CUSTOM POPOVERVIEWCONTROLLER METHODS
#pragma mark -

-(void) initWithMenuType:(int)type{

 menuType = type;
}

-(id) initWithMenuType:(int)type andData:(NSMutableArray *)dataSet fromViewItem:(id)sender 
    withMainView:(UIView *)mView{

 [super init];
 menuType = type;
 data = dataSet;
 rootView = sender;
 displayView = mView;
 arrowDir = UIPopoverArrowDirectionUp;
 customViewController = [[UIViewController alloc] initWithNibName:@"PopUpMenu" bundle:nil];

 return self;
}

-(void) setPopUpArrowDirection:(UIPopoverArrowDirection) arrow{

 arrowDir = arrow; 
}


-(void) showPopUp{ 

 //UIPicker Menu
 if (menuType==1) {

  //UIPicker Setup
  menu = [[UIPickerView alloc]initWithFrame:CGRectMake(0,100,162,162)];
  menu.delegate = self;
  menu.dataSource = self;

  [menu reloadAllComponents];
  [menu selectRow:0 inComponent:0 animated:YES];

  //Add the picker to the view
  [customViewController.view addSubview:menu];

  popView = [[UIPopoverController alloc] initWithContentViewController:customViewController] ;
  [popView setDelegate:self];
  CGRect pos = [rootView frame];
  [popView presentPopoverFromRect:CGRectMake(pos.origin.x,pos.origin.y,0,pos.size.height) 
         inView:displayView permittedArrowDirections:arrowDir animated:YES];
  //[popView setPopoverContentSize:CGSizeMake(menu.frame.size.width+5,menu.frame.size.height+5)];

 }


}

#pragma mark -
#pragma mark VIEW CONTROLLER DELEGATE METHODS
#pragma mark -

// The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
/*
 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
 self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
 if (self) {
 // Custom initialization.
 }
 return self;
 }
 */

/*
 // Implement loadView to create a view hierarchy programmatically, without using a nib.
 - (void)loadView {
 }
 */

/*
 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
 - (void)viewDidLoad {
 [super viewDidLoad];

 }*/

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    return YES;
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}


- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
 [data release];
 [popView release];
 [menu release];
 [rootView release];
 [displayView release];
 [customViewController release];

}

#pragma mark -
#pragma mark UIPICKERVIEW DELEGATE & DATASOURCE METHODS
#pragma mark -

#pragma mark -
#pragma mark UIPickerViewDataSource Methods

- (NSInteger) pickerView: (UIPickerView *) pickerView numberOfRowsInComponent: (NSInteger) component {

 return [data count];
}

- (NSInteger) numberOfComponentsInPickerView: (UIPickerView *) pickerView {

 return 1;
}

#pragma mark -
#pragma mark UIPickerViewDelegate Methods



// Row height in pixels
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {

 return 40.0f;
}

// Column width in pixels
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {

    return 90.0f;
}

- (NSString *) pickerView: (UIPickerView *) pickerView titleForRow: (NSInteger) row 
    forComponent: (NSInteger) component {

 return [data objectAtIndex:row];
}


- (void) pickerView: (UIPickerView *) pickerView 
    didSelectRow: (NSInteger) row inComponent: (NSInteger) component {
}

Ответы [ 3 ]

5 голосов
/ 10 апреля 2011

Если кто-то еще сталкивается с этим конкретным предупреждением в консоли «Не удалось найти отображенное изображение UIPickerViewFrameRight-162-Popover.png», я думаю, я выяснил, почему оно появляется.

HIG слабо указывает, чтоUIPickerView должен быть добавлен только в Popover на iPad.

"На iPad представьте указатель даты и времени только в пределах popover."

http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig/UIElementGuidelines/UIElementGuidelines.html

InВ моих экспериментах UIPickerView должен быть прямым и единственным представлением текущего UIViewController во всплывающем окне.Если UIPickerView появляется в другом месте в иерархии представления, появляется предупреждение, и UIPickerView будет выглядеть плохо (как будто ему не хватает левой и правой частей представления).

В приведенном выше коде вы можете видеть, что UIPickerViewбыл добавлен как подпредставление rootView в customController:

[customViewController.view addSubview:menu];

Это, вероятно, сработало бы, если бы UIPickerView был корневым представлением в customController.

Вы можете программно сделать UIPickerView корневым представлением контроллера, переопределив метод loadView контроллера и назначив UIPickerView непосредственно корневому представлению контроллера:

- (void)loadView {
  CGRect frame = CGRectMake(0,0, 300, 300);
  UIPickerView *v = [[[UIPickerView alloc] initWithFrame:frame] autorelease];
  v.delegate = self;   // assuming controller adopts UIPickerViewDelegate 
  v.dataSource = self; // assuming controller adopts UIPickerViewDataSource 

  self.view = v;
}

Надеюсь, что этопомогает кому-то.

2 голосов
/ 28 ноября 2010

Хорошо, я не совсем уверен, что случилось, но я удалил проект и переписал этот код и вуаля ... Больше никаких проблем.

0 голосов
/ 14 августа 2012

Я только недавно столкнулся с той же проблемой с моим приложением на iPad и iPhone. На самом деле это было простое, но глупое исправление, которое включало увеличение высоты iPad до 180 и 162 на iPhone. Бог должен любить яблоко, но я не люблю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...