2012-01-19 3 views
1

Mac, iOS, Xcode 및 objective-c를 처음 사용합니다. 저는 Windows 세계 (.net, C#, Silverlight 등)에 매우 익숙합니다. 그러나 그 중 아무 것도 Mac에서 여기에서하는 일에 실제로 적용되지 않습니다.iOS 키보드 반송 처리기

간단히 말해서 포인터와 코드 검토를 통해 나를 도울 수 있기를 바랍니다. 웹에 많은 기사가 있습니다 (스택 오버플로에있는 기사가 많음). 어떻게하면 일을하는지에 대한 모든 의견을 쉽게 잃어 버릴 수 있습니다.

iOS 키보드를 Next 및 Done에 반응시키고 키보드 위에 툴바를 표시하고 키보드를위한 공간을 허용하기 위해 텍스트 필드를 이동시키는 등의 간단한 작업을하기로 결정했습니다. 여기에있는 첫 번째 샘플은 간단한 하나, 세 개의 텍스트 필드, 두 개는 Next, 두 번째는 Done으로 키보드를 닫습니다.

enter image description here

나는 헤더 파일에 각각의 텍스트 필드에 UITextFieldDelegate과 함께 IBOutlet을 추가했다. 또한 텍스트 필드를 IBOutlet에 Ctrl 키를 누른 상태에서 드래그하여 연결했습니다. 내가 텍스트 필드에 대한 합성 문, 플래그에 viewDidUnload (자동 메모리 릴리스 모드를 사용하여) 릴리스에 대한 메모리에 전무로 세트를 추가 한 소스 파일에서
#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController <UITextFieldDelegate> 

@property (weak, nonatomic) IBOutlet UITextField* firstNameTextField; 
@property (weak, nonatomic) IBOutlet UITextField* lastNameTextField; 
@property (weak, nonatomic) IBOutlet UITextField* cityTextField; 

@end 

과 초점을 설정하는 textFieldShouldReturn 방법 텍스트 필드에.

#import "ViewController.h" 

@implementation ViewController 

@synthesize firstNameTextField = _firstNameTextField; 
@synthesize lastNameTextField = _lastNameTextField; 
@synthesize cityTextField = _cityTextField; 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Release any cached data, images, etc that aren't in use. 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)viewDidUnload 
{ 
    [self setFirstNameTextField:nil]; 
    [self setLastNameTextField:nil]; 
    [self setCityTextField:nil]; 

    [super viewDidUnload];  
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return YES; 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{ 
    if (theTextField == self.firstNameTextField) 
    { 
     [self.lastNameTextField becomeFirstResponder]; 
    } 
    else if (theTextField == self.lastNameTextField) 
    { 
     [self.cityTextField becomeFirstResponder]; 
    } 
    else 
    { 
     [theTextField resignFirstResponder]; 
    } 

    return YES; 
} 
@end 

이렇게하는 방법은 무엇입니까?

객관적인 관점에서 볼 때 * (포인터 용)를 유형 또는 이름 앞에 넣으시겠습니까? 메모리 관리는 올바른

@property (weak, nonatomic) IBOutlet UITextField* firstNameTextField; 

@property (weak, nonatomic) IBOutlet UITextField *firstNameTextField; 

인가? 기억이 올바르게 풀려나고, 살아 남을 것입니까?

감사합니다.

답변

1

앤서니 (Anthony)가 말했듯이, 별표의 위치는 실제로 스타일의 관심사입니다. 개인적으로 나는 인스턴스의 측면에서 *를 선호합니다 (Class * classInstance). 클래스가 아니라 가리키는 인스턴스이기 때문입니다. 그러나 의견은 다릅니다.

일반적으로 모든 속성을 약한 것으로 정의한 것을 제외하면 코드는 괜찮습니다. 뷰 컨트롤러의 수명 동안이 IBOutlet 속성을 유지하기를 원하기 때문에 강력해야합니다. IB에서 뷰를 구성 했더라도 뷰 컨트롤러는 여전히 해당 IB 객체를 '소유'합니다.이 할당 때 개체가 유지된다는 것을 의미합니다

@property (strong, nonatomic) AClass *aClassInstance; 

:

당신은 속성 유형을 정의 할 때. 이 경우, 할당이 당신의 콘센트를 유선 한 덕분에 발생, 당신은 수동으로 지정하지 않은,하지만이 유지 계속 발생 :

[self setProperty:object] //retains 'object' 

그리고 발표를 당신이 그것을 nil을 때 :

[self setProperty:nil] //releases 'object' currently retained by property 

그리고 당신은 "해제"할 필요가 없습니다 것입니다

@property (weak, nonatomic) 

: (당신이했던 것처럼) 당신이 약한 속성을 원하는 실제로 않는 경우/(예를 들어, 당신이 소유하지 않은 개체에 대한 참조를 위해) 경우 나중에 ni로 설정하면됩니다. l 당신의 viewDidUnload에. 이것을 nil로 설정하는 것은 좋은 습관이지만 메모리 균형을 유지할 필요는 없습니다.

+0

좋습니다. 나는 애플 웹 사이트에있는 예제 중 하나에서 약한 키워드를 얻었지만, 어느 것을 사용해야할지 확실하지 않았다. 따라서 실제 TextField 컨트롤은 스토리 보드에 있으며 UI를 통해 속성에 연결되지만 ViewController 지속 기간 동안 변수가 지속됩니다. 충분히 공정한 것 같습니다. –

+0

변경 사항을 적용하고 다시 실행합니다. 애플의 세계에서 애플 리케이션이 메모리 누수없이 올바르게 닫혔는지 확인하기 위해 어떤 툴을 사용해야하는지 알아 내야한다. –

1

*은 사용자가 독점 개발자 인 경우 사용자가 정의하거나 그룹에서 작업하는 경우 코딩 표준> 일관성을 유지합니다.

메모리에 대해 살펴 보지 않았지만 UITextFieldinputAccessoryView 속성을 조사하고 싶을 수 있습니다. 해당 속성에 UIToolbar과 같은 UIView을 할당 할 수 있습니다. 도구 모음에서 next, previousdone 단추를 추가하십시오. 이것은 사파리와 같은 다른 애플리케이션이 얼마나 많은 행동을하는지와 비슷한 행동을합니다.

+0

대다수의 객관적인 예는 당신이 말한 것처럼 인스턴스 옆에 별표가 있습니다. 나는 솔로 개발자이기 때문에 내 규칙이 모두 내 것이다. :-) 다른 사람들의 생각이 궁금하다. 나는 이전에 C/C++를 사용할 때 유형 옆에 *를 사용했습니다. 필자의 주장은 foo라는 char * 포인터이고, char *을 가져 오는 변수의 타입이다. –

+0

형식 이름의 일부로 볼 수 있기 때문에 항상 형식으로 입력합니다. – Anthony