2013-12-12 2 views
0

IBAction을 통해 사용자 지정 UIView를 호출하는보기 컨트롤러가 있습니다. 사용자 지정보기에는 화면 하단에서 위로 이동하는 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.navigationController.view addSubview:self.scrollPickerView]; 대신 [self.view.window addSubview:self.scrollPickerView];을 사용해 보았습니다. 동작은 동일합니다.

+0

[self.navigationController.view addSubview : self.scrollPickerView]; 이 링크가 잘못되었습니다. 그리고 왜 당신은 두 번째 언론에서만 보여줍니다. 그것은 mb RunLoop 다시 그리기 화면입니까? – Bimawa

+0

어떻게 잘못되었는지 설명 할 수 있습니까? 올바른 방법은 무엇입니까? –

+0

self.navigationController에는 2 개의 하위보기가 있습니다. Apple Documentation에서이 내용을 읽을 수 있습니다. https://developer.apple.com/library/iOS/documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html 그리고 하위 뷰를 추가 할 필요가 없습니다. – Bimawa

답변

0

이 줄 :

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

읽어야합니다

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

나는 그것을 시도하고, 그것은 여전히 ​​동일합니다. 또한 콘솔에서 "테이블의 첫 번째 응답자보기를 설정하지만이 유형 (셀/머리글/바닥 글)을 알지 못합니다"라는 경고가 표시됩니다. –

0

는 대신 -initWithFrame:-init를 호출하고, 그래서보기는 CGRectZero의 기본 프레임과 함께 종료된다. , 당신은 -init-initWithFrame:을 현재 self.scrollPickerView = … 코드를 유지하고 변경할 수 있습니다, 또는

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

: 그런 다음 자신의 프레임을 만들고 있다는 것을 감안하면, 그 전화도 함께 시작하는 것을에 전달할 수 like :

- (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

두 가지 방법을 시도했지만 여전히 동일합니다. –

관련 문제