문제

Xcode 및 Interface Builder를 사용하여 iPhone을위한 간단한 프로젝트를 만들고 있습니다. 대의원이 무엇인지 이해하고 있지만 사용하는 데 문제가 있습니다.

인터페이스에 uitextfield가 있습니다. 사용자가 탭하면 키보드가 표시되지만 키보드를 숨기는 방법을 수동으로 프로그래밍해야합니다. 대표를 사용하여 수행 할 수 있습니다. IB에서는 라이브러리에서 객체를 가져 와서 클래스 이름을 Control1Delegate로 제공 한 다음 내 텍스트 필드에서 대의원 출구를 연결 하여이 Control1Delegate가됩니다. 이 control1delegate 클래스에 대한 .m 및 .h 파일도 있습니다.

Control1delegate.h

@interface Control1Delegate : NSObject <UITextFieldDelegate> {
}

- (BOOL) textFieldShouldReturn:(UITextField *)textField;

@end

Control1delegate.m

#import "Control1Delegate.h"

@implementation Control1Delegate

- (BOOL) textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

@end

그러나 이것은 작동하지 않습니다. 실행할 때는 MSG 또는 EXEC_BAD_ACCESS없이 TextFieldShouldReturn 메소드 또는 충돌에 도달하지 않습니다. 재미있는 점은 메소드를 컨트롤러 파일 (하나의 마법사가 생성)으로 이동하고 Uitextfield 에서이 컨트롤러 (파일 소유자)로 연결하면 모든 것이 예상대로 작동한다는 것입니다. 대부분의 Apple 코드 자습서는 위임 된 메소드를 분리 된 클래스 대신 임의의 개체에 넣는 것을 보았습니다. 이유를 알고 싶습니다. 별도의 수업에서 대표를 가질 수 없습니까?

내가 여기서 무엇이 빠졌습니까? 널 포인터? 물체 생명체?

도움이 되었습니까?

해결책

제어 1Delegate 객체가 생성 된 직후에 파괴됩니다. 모든 최상위 NIB 객체는 살아있는 상태로 유지하려면 유지해야합니다. 참조 리소스 프로그래밍 안내서 : NIB 객체 수명주기.

파일의 소유자는 객체를 유지하기 위해 이와 같은 속성을 가질 수 있습니다.

@property (nonatomic, retain) IBOutlet Control1Delegate *control1delegate;

더 이상 필요하지 않은 후에 객체를 해제해야합니다.

다른 팁

해당 목적을 위해 구축 된 방법을 포함하여 모든 클래스에 대의원을 배치 할 수 있습니다. Apple (및 기타 프로그래머)이 일반적으로 대의원 기능을 위해 특별히 클래스를 만들지 않는 이유는 데이터를 공유하기가 너무 복잡하고 어렵 기 때문입니다. 예를 들어, 내 프로젝트 중 하나에서 창에서 대의원 메소드, 창 내부 테이블보기 및 창의 도구 모음을 처리하는 창 컨트롤러 서브 클래스를 만들 수 있습니다. 해당 창의 상태를 조작하고 유지하는 데 필요한 모든 것은 하나의 컨트롤러 클래스에 있습니다. 이제 동일한 기능을 수행하는 세 가지 개별 클래스 (아마도 컨트롤러 클래스를 관리 할 것입니다)를 상상해보십시오. 이는 실질적인 이익이없는 많은 추가 작업입니다.

왜 추락하는지에 관해서는 응용 프로그램의 다른 곳에서 메모리 관리에 실수를하는 것처럼 들립니다. 디버거를 사용하여 어디에서 왔는지 정확히 추적 할 수 있습니다.

둘 다 감사합니다. 나는 지금 내 문제를 해결하는 방법을 알고있을뿐만 아니라 NIB 생성 과정에서 객체가 어떻게 유지되는지 이해했습니다. IB에서 객체를 만드는 것만으로는 충분하지 않습니다. 새로운 엔티티 인 경우 파일 소유자의 실제 IVAR에 연결되어 있어야합니다 (적절하게 합성 된 getter/setter).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top