У меня есть контроллер вида, который вызывает пользовательский UIView через IBAction. Пользовательский вид содержит UIPickerView, который скользит вверху снизу экрана и панель инструментов с «отменой» и над ним - «сделанные» кнопки. Проблема заключается в том, что вид появляется только на экране после вызова второго раза. Используя контрольные точки, я могу проверить, что каждая строка кода вызывается одновременно. Кажется, что все происходит одинаково каждый раз. Ничто не является NIL, и на самом деле это похоже на то, что приложение работает, а не только в первый раз, когда он вызван. Вам всегда нужно дважды щелкнуть кнопку, чтобы получить представление до тех пор, пока приложение запущено.UIView показывает только после вызова второго раза
Понятно, что код для пользовательского представления выбора не является моим. Я скопировал это с чужого примера. Я не уверен, что это проблема или нет. Я не понимаю, как это может быть, но я немного над головой. Вот как я вызываю представление из своего контроллера представления.
- (IBAction)statusPickerButtonPressed:(id)sender {
self.scrollPickerView = [[StatusPickerView alloc]init];
[self.navigationController.view addSubview:self.scrollPickerView];
self.scrollPickerView.delegate = self;
self.scrollPickerView.dataSource = self;
}
и вот пользовательские UIView
#import "StatusPickerView.h"
@interface StatusPickerView()
@property NSArray *pickerArray;
@property NSInteger selectedRow;
@end
@implementation StatusPickerView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setToolbar];
[self becomeFirstResponder];
float screenWidth = [UIScreen mainScreen].bounds.size.width;
float pickerWidth = screenWidth * 3/4;
float xPoint = screenWidth/2 - pickerWidth/2;
[self setFrame: CGRectMake(xPoint, 50.0f, pickerWidth, 180.0f)];
self.showsSelectionIndicator = YES;
[self selectRow:3 inComponent:0 animated:YES];
}
return self;
}
-(void)setToolbar
{
_toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
[_toolbar setBarStyle:UIBarStyleDefault];
UIBarButtonItem * btnCancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self action:@selector(barbtnPressed:)];
UIBarButtonItem * flexible = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
target:nil action:nil];
UIBarButtonItem * btnDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self action:@selector(barbtnPressed:)];
[btnCancel setTag:1];
[btnCancel setStyle:UIBarButtonItemStyleBordered];
[btnDone setTag:2];
[btnDone setStyle:UIBarButtonItemStyleBordered];
NSArray * btnArray = [[NSArray alloc] initWithObjects:btnCancel, flexible, btnDone, nil];
[_toolbar setItems:btnArray];
self.inputAccessoryView = _toolbar;
self.inputView = self;
}
-(BOOL)canBecomeFirstResponder
{
return true;
}
-(void)barbtnPressed:(id)sender
{
NSInteger tag = [sender tag];
switch (tag) {
case 1:
{
[self removeFromSuperview];
break;
}
case 2:{
[self removeFromSuperview];
self.selectedRow = [self selectedRowInComponent:0];
[[NSNotificationCenter defaultCenter]postNotificationName:@"user_selected_new_section" object:self];
}
default:
break;
}
}
-(int)giveSelectedRow{
return self.selectedRow;
}
Я полностью готов чувствовать себя глупо здесь, как и решение, вероятно, очевидно, просто не очевидно для меня.
Редактировать: Я пробовал использовать [self.view.window addSubview:self.scrollPickerView];
вместо [self.navigationController.view addSubview:self.scrollPickerView];
, и поведение в точности то же самое.
[self.navigationController.view addSubview: self.scrollPickerView]; Эта ссылка неверна. И почему вы просматриваете показ только во второй прессе .. это mb RunLoop redraw screen? – Bimawa
Не могли бы вы объяснить, как это неправильно? Каким должен быть правильный путь? –
self.navigationController имеет 2 подзапроса. Вы можете прочитать об этом в документации Apple https://developer.apple.com/library/iOS/documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html И вам больше не нужно добавлять subview. – Bimawa