2012-08-15 4 views
2

오늘 아침에 저는 사용자로부터 입력 문자열 하나를 얻기 위해 UIAlertView을 해킹하는 어딘가에서 발견 된 (예전 앱에서 사용 된) 일부 코드를 살펴 보았습니다. 그것은 과도한 목적을위한 것이고 어리석은 것처럼 보이지만 나는 더 간단한 방법을 본 적이 없습니다. 나는 다음과 같은 접근법을 생각해 냈다. (iPad 5.1.1 및 시뮬레이터)으로 작동한다.inputAccessoryView를 실제 입력에 사용할 수 있습니까?

내 질문에는 다소 제한이 없지만 본질적으로 전략으로 중단되는 조건이 있습니다 : 액세서리보기가있는 화면 외부 텍스트 필드 만들기, 액세서리보기에 프록시 텍스트 필드 넣기 및 다양한 속성 설정을 프록시로 전달 하시겠습니까?

PMKeyboardTextField.h :

#import <UIKit/UIKit.h> 

@interface PMKeyboardTextField : UITextField 
- (id)initWithPrompt:(NSString *)prompt; 
@end 

PMKeyboardTextField.m :

#import "PMKeyboardTextField.h" 

@interface PMKeyboardTextField() 
@property (nonatomic, strong) UITextField *inputField; 
@end 

@implementation PMKeyboardTextField 
@synthesize inputField = _inputField; 

- (id)initWithPrompt:(NSString *)prompt { 
    self = [super initWithFrame:CGRectMake(-1, -1, 1, 1)]; 
    if (self) { 
     UIView *accessory = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 72)]; 
     [accessory setBackgroundColor:[UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:0.8]]; 

     UILabel *getLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, 8, 284, 21)]; 
     [getLabel setBackgroundColor:[UIColor clearColor]]; 
     getLabel.text = prompt; 
     [accessory addSubview:getLabel]; 

     self.inputField = [[UITextField alloc] initWithFrame:CGRectMake(18, 37, 264, 31)]; 
     [accessory addSubview:self.inputField]; 

     self.inputAccessoryView = accessory; 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(keyboardDidShow) 
                name:UIKeyboardDidShowNotification 
                object:nil]; 
    } 
    return self; 
} 

- (void)keyboardDidShow { 
    [self.inputField becomeFirstResponder]; 
} 

- (id<UITextFieldDelegate>)delegate { 
    return self.inputField.delegate; 
} 

- (void)setDelegate:(id<UITextFieldDelegate>)delegate { 
    self.inputField.delegate = delegate; 
} 

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 
@end 

답변

2

경고보기의 과도한 혼란이나 화면상의 위치 변경의 필요성을 피하는이 아이디어가 마음에 드는 것처럼 치명적인 결함은 다른 포럼에서 나에게 지적되었습니다. 일부 사람들은 외부 키보드를 사용합니다 !

2

당신이 아이폰 OS 5.0을 대상으로하는 경우 또는 나중에, 당신은 경고보기를 해킹 할 필요가 없습니다 텍스트 필드를 추가합니다 . 경고보기의 alertViewStyleUIAlertViewStylePlainTextInput으로 설정하면 경고보기에 평문 입력 필드 하나를 표시 할 수 있습니다.이 필드는 textFieldAtIndex:을 경고보기로 보내 액세스 할 수 있습니다.

그 외에도 해결 방법이 괜찮은 것 같습니다. 나는 당신이 당신의 일반 앱 윈도우가 아닌 경고보기의 윈도우에 당신의 오프 스크린 텍스트 필드를 추가해야만한다고 생각한다.

+0

실제로 이것은 경고보기를 만들지 않고도 모든보기에서 작동하기위한 것입니다. (내가 실제로 염두에두고있는 것은 누군가가 테이블 뷰에 뭔가를 추가하기 위해 '+'를 눌렀을 때 테이블 테이블 셀에 편집 가능한 필드를 넣지 않고 이름을 지정하고 싶을 때를위한 것입니다. .or 그렇지 않으면 불필요한 경고보기를 넣어.) –

+0

그 경우에는 액세서리 표시 줄을 최상위보기의 하단 가장자리에 일반 하위보기로 추가하고 그 안에있는 텍스트 필드에'becomeFirstResponder'를 보내고 슬라이드 그것은 UIKeyboardWillShowNotification을 기반으로합니다. –

관련 문제