2011-09-26 8 views
0

나는 절대 초보자 해요, 나는 두 개의 텍스트 필드를 반전 버튼이 필요를 반전 버튼을 설정하는 값을 유지 한 다음 릴리스해야하지만 필자는 값을 쓰는 방법을 잘 모릅니다.방법이 텍스트 필드

+0

우리는 모두 초보자 였고 우리는 여전히 한 과목이나 다른 주제에서 초보자입니다 ... – Coffee

답변

1

이 매우 간단합니다 : 당신은 유지할 수있는 유일한 텍스트 /있는 NSString가에 의해 보류 그만 것입니다 UITextField 그 자체, 즉 name.textsurname.text으로 바뀝니다.

- (IBAction)swapText { 
    NSString* temp = [name.text retain]; 
    name.text = surname.text; 
    surname.text = temp; 
    [temp release]; 
} 
+0

와우, 정말 기꺼이 대답 해 주셔서 감사합니다. 나는 진실로 evryone에게 감사하며, Im은 (는) 당신의 모든 대답을 연구 할 시간을 갖습니다. 첫 번째 견해에서 마지막 대답은 나를위한 좋은 것으로 보인다. – ginofalaci

+0

괜찮습니다. 감사합니다. – ginofalaci

+0

위대한 :)이 솔루션은 당신을 위해 작동하는 경우, 허용 대답 옆에있는 녹색 체크 표시를 체크하여 해결 답변으로 표시하는 것을 잊지 마세요 – AliSoftware

0

처리해야 할 유일한 개체는 UITextFields를 할당/할당 취소하는 것입니다. 당신의 UITextfields는 인스턴스 변수를하는 가정하면 다음과 같은 코드를 사용할 수 있습니다 (헤더 파일에 선언) :

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    CGRect b = [[self view] bounds]; 

    _txt1 = [[UITextField alloc] initWithFrame:CGRectMake(CGRectGetMidX(b)-100, 50, 200, 29)]; 
    [_txt1 setBorderStyle:UITextBorderStyleRoundedRect]; 
    [[self view] addSubview:_txt1]; 

    _txt2 = [[UITextField alloc] initWithFrame:CGRectMake(CGRectGetMidX(b)-100, 100, 200, 29)]; 
    [_txt2 setBorderStyle:UITextBorderStyleRoundedRect]; 
    [[self view] addSubview:_txt2]; 

    UIButton* btnSwap = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [btnSwap setFrame:CGRectMake(CGRectGetMidX(b)-75, 150, 150, 44)]; 
    [btnSwap setTitle:@"Swap Text" forState:UIControlStateNormal]; 
    [btnSwap addTarget:self action:@selector(tappedSwapButton) forControlEvents:UIControlEventTouchUpInside]; 
    [[self view] addSubview:btnSwap]; 
} 

- (void)tappedSwapButton 
{ 
    NSString* text1 = [_txt1 text]; 
    NSString* text2 = [_txt2 text]; 

    [_txt2 setText:text1]; 
    [_txt1 setText:text2]; 
} 

- (void)dealloc 
{ 
    [_txt1 release]; 
    [_txt2 release]; 

    [super dealloc]; 
} 
+0

UIButton은 [UIButton buttonWithType :] 메서드를 사용하고 있습니다. 이것은 UITextFields using 및 alloc/init 메소드와 달리 자동 릴리즈 된 객체입니다. 그러므로 우리가 dealloc 메쏘드에서 UIButton을 dealloc하지 않는 이유 –

+0

'tappedSwapButton'의 코드는 인스턴스 변수'text1'와'text2'가 문자열을 유지하지 못하게하고'[_txt2 setText : text1] ', 이전에 txt2에 있던 문자열 (그리고'text2' 변수를 사용하여 가리키는 문자열)은 누군가에 의해 유지되지 않고 잠재적으로 메모리에서 제거 될 것입니다 ('text2'는 떠돌아 다니는 포인터입니다 - 이후에 삭제 된 메모리로). 운이 좋으면이 방법이 효과가있을 수 있지만 그 동안 메모리가 지워지면 직접 충돌합니다. 스와핑 작업 중 값을 유지해야합니다. – AliSoftware

0

주어진 코드에 따르면 첫 번째 텍스트 필드의 텍스트가 손실됩니다. 그 문제를 해결하는 가장 쉬운 방법은 name.text에 포함 된 문자열을 보유 할 임시는 NSString 객체를 선언하는 것입니다 : 당신이 점 표기법을 사용하고 있기 때문에

- (IBAction)swapText{ 

    // create a temp string to hold the contents of name.text 
    NSString *tempString = [NSString stringWithString: name.text]; 

    name.text = surname.text; 
    surname.text = tempString; 
} 

, 그것은 가정을 그 "이름"과 "성 "는 바꿀 두 텍스트 필드 모두에 대한 IBOutlet 참조 속성입니다. 이 경우 두 속성 모두를 "보유"하는 한 메모리 관리를 담당합니다 (.m 파일의 dealloc 메서드에서 해제하는 한).

+0

사실이 아닙니다 : UITextField **의 '텍스트'속성은 ** in입니다 "retain"하지만 name.text에 의한 NSString 보류는'name.text = surname.text' (그리고'surname.text'로 대체)를 설정할 때 해제 될 것입니다. 이 단계에서'tempString'에 저장된 원래의'NSString'은 아무에게도 남지 않으므로 잠재적으로 메모리에서 제거됩니다. tempString (지역 변수이고 ** 값을 유지하는 ** 속성이 아닌 **)을 스왑하는 동안 명시 적으로 보유해야하고 나중에 스와핑을 해제해야합니다. (운이 좋으면 운이 좋을 수도 있지만 운에 의지 할 수는 없습니다!) – AliSoftware

+0

autoreleased NSString을 사용하여 name.text에있는 내용을 보관할 수있는 절대적으로 올바른 코드입니다. 코멘트 주셔서 감사합니다! – 5StringRyan

+0

확인. 무의미한 메모리 할당을 피하기 위해 새로운 (autoreleased) NSString을 만드는 대신 명시 적으로 retain + autorelease를 보내는 것이 더 좋습니다.실제로, NSString은 Copy-On-Write를 수행하기 위해 내부적으로 최적화되어 있습니다 (하지만 코드를 작성할 때이를 알고 있어야합니다). 그래서 코코아가 이러한 경우에 최적화되어 있으므로 실제로 할당을 수행하지 않을 것이라고 생각합니다. 그러나 retain + autorelease를 사용하면 새로운 객체로 캡슐화하는 대신 동일한 객체를 작업 할 때보다 의미가 있습니다;) – AliSoftware