2014-09-16 6 views
0

UI 요소를 가져 오기 위해 다른 클래스를 사용하는보기 컨트롤러 (vc1)가 있습니다. 그래서 vc1 뷰는 하위 뷰로서 레이아웃이라는 클래스에서 반환 된 다른 뷰를 설정합니다. Layout 클래스에서 반환 된 뷰에는 UIbutton이 포함되어 있습니다. 레이아웃 클래스에서 는이 코드를 가지고 : 내가 잘못이 발생 버튼 뭔가를 클릭 할 때, 그러나버튼을 클릭하면 Ios EXC_BAD_ACCESS 오류가 발생합니다.

- (void)button_clicked:(id)sender { 
    NSLog(@"btn clickd"); 
} 

:

[btn addTarget:self action:@selector(button_clicked:) forControlEvents:UIControlEventTouchUpInside]; 

그런 다음 같은 클래스 (레이아웃)에서 나는 또한 button_clicked 방법을 선언했다. 디버그 영역에 오류 메시지가 표시되지 않지만 Xcode 상태가 좋지 않습니다. 시뮬레이터는 초점을 잃고 엑스 코드는이 라인을 가진 파일 (나는 그것의 AppDelegate.m를 추측)로 나타납니다
@autoreleasepool { 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
} 

녹색 색상으로 강조했다.

스레드 1 : 는 또한, 코드에서 나는 메시지가 표시 EXC_BAD_ACCESS (코드 = 2, ADRESS = 0 * 9)를

무엇이 잘못 될 수 있을까? 또한 vc1이 버튼 클릭을 관리해야하므로 두려울 것입니다. 따라서 vc1 내부에 배치하는 것이 가장 좋을 것이라고 생각합니다. 너 그렇게 생각하지 않아?

+1

예외 중단 점을 추가하면 더 정확한 이유가 표시됩니다. –

답변

1

사용자가 단추의 대상으로 설정 한 Layout의 인스턴스가 해제 된 것이므로 사용자가 단추를 누르기 전에 유효하지 않은 포인터를 사용하는 것이 좋습니다.

사용중인 Layout의 인스턴스가 무엇을 유지하는지 확인하고 적어도 버튼 동작의 대상인 시간 동안 유지되는지 확인하십시오.

0

코드에서 설정 한대로 버튼의 대상 -

[btn addTarget:self action:@selector(button_clicked:) forControlEvents:UIControlEventTouchUpInside]; 

당신이 버튼을 클릭하여 이전에 출시 된 지 수 있습니다.

단추에 호출 할 메서드를보기 컨트롤러 (vc1) 안쪽을 클릭하려면 배치 할 수 있습니다. 단추의 대상을 자체에서 무효로 변경하십시오.

[btn addTarget:nil action:@selector(button_clicked:) forControlEvents:UIControlEventTouchUpInside]; 

그런 다음 vc1에서 "button_clicked"메소드를 구현하십시오. 레이아웃 클래스에서 "button_clicked"가 무시할 수있는 선언되지 않은 선택기라는 경고가있을 수 있습니다.

"레이아웃"클래스에서 "button_clicked"메서드를 호출하려는 경우 그렇게 할 수 있습니다. vc1 클래스에서 강력한 속성을 가진 Layout 클래스의 속성을 선언하십시오. 그런 다음 레이아웃 클래스의 객체를 만들고 그 객체를 사용하여 속성을 인스턴스화합니다.

Layout *propertyName = [[Layout alloc] init]; 

지금, 당신의 기능 (함수 이름하자 - getViewFromLayoutClass)를 호출 당신이 버튼을 클릭하면 이제 다음과 같은 -

[propertyName getViewFromLayoutClass] 

로보기를 반환, 당신의 레이아웃에 메소드를 호출한다 수업.

관련 문제