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];
을 사용해 보았습니다. 동작은 동일합니다.
[self.navigationController.view addSubview : self.scrollPickerView]; 이 링크가 잘못되었습니다. 그리고 왜 당신은 두 번째 언론에서만 보여줍니다. 그것은 mb RunLoop 다시 그리기 화면입니까? – Bimawa
어떻게 잘못되었는지 설명 할 수 있습니까? 올바른 방법은 무엇입니까? –
self.navigationController에는 2 개의 하위보기가 있습니다. Apple Documentation에서이 내용을 읽을 수 있습니다. https://developer.apple.com/library/iOS/documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html 그리고 하위 뷰를 추가 할 필요가 없습니다. – Bimawa