2013-12-12 3 views
0

У меня есть контроллер вида, который вызывает пользовательский 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];, и поведение в точности то же самое.

+0

[self.navigationController.view addSubview: self.scrollPickerView]; Эта ссылка неверна. И почему вы просматриваете показ только во второй прессе .. это mb RunLoop redraw screen? – Bimawa

+0

Не могли бы вы объяснить, как это неправильно? Каким должен быть правильный путь? –

+0

self.navigationController имеет 2 подзапроса. Вы можете прочитать об этом в документации Apple https://developer.apple.com/library/iOS/documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html И вам больше не нужно добавлять subview. – Bimawa

ответ

0

Эта линия:

[self.navigationController.view addSubview:self.scrollPickerView]; 

следует читать:

[self.view addSubview:self.scrollPickerView]; 
+0

Я пробовал это, и он все тот же. Я также получаю это предупреждение в консоли, «устанавливая первый вид ответчика таблицы, но мы не знаем его тип (cell/header/footer)». –

0

Вы звоните -init вместо -initWithFrame:, поэтому Ваше мнение оседает с рамкой по умолчанию CGRectZero. Учитывая, что вы затем сделать кадр самостоятельно, что вызов мог бы также передать, что, чтобы начать с:

self.scrollPickerView = [[ScrollPickerView alloc] initWithFrame:CGRectZero]; 

В качестве альтернативы, вы можете сохранить текущий self.scrollPickerView = … код и изменить -initWithFrame: к -init, например:

- (id)init 
{ 
    float screenWidth = [UIScreen mainScreen].bounds.size.width; 
    float pickerWidth = screenWidth * 3/4; 
    float xPoint = screenWidth/2 - pickerWidth/2; 
    self = [super initWithFrame:CGRectMake(xPoint, 50.0f, pickerWidth, 180.0f)]; 

    if (self) { 
     [self setToolbar]; 
     [self becomeFirstResponder]; 

     self.showsSelectionIndicator = YES; 
     [self selectRow:3 inComponent:0 animated:YES]; 
    } 
    return self; 
} 
+0

Я пробовал это в обоих направлениях, но это все равно. –

Смежные вопросы