1

각 레벨마다 다른 컨트롤러를 사용하는 게임을 개발 중입니다. 이것은 가속도계 통해 흔들림을 검출해야하므로 그 대리인과 같이 자체를 등록 UIAccelerometer가 두 번째 대리인에게 이벤트를 보내지 않습니다.

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer]; 
accel.delegate = self; 
accel.updateInterval = kUpdateInterval; 

레벨 종료

이 제어기 dealloc'd 및 해제 얻는다. 이전에는 UIAccelerometer에서 대리자를 제외하지 않았으므로이 컨트롤러를 해제 한 후 충돌이 발생했습니다 (즉, 이제는 해제 된 개체에 이벤트를 보내고 있음). 이제 dealloc 내부에서 다음을 수행합니다.

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer]; 
accel.delegate = nil; 

모두 1 단계는 장애없이 재생됩니다. 문제는 다음 레벨로 넘어 가면 새로운 레벨 컨트롤러를 만들고 코드의 첫 번째 배치를 다시 실행합니다 (새 컨트롤러를 이제 대리자로 설정). 이 후에는 가속도계에서 전화가 걸리지 않습니다.

그렇다면 Accelerometer에 대한 응용 프로그램 당 하나의 대리인 만 허용 할 수 있습니까, 아니면 방금 누락 되었습니까? 나는 문서에서 여러 번 대리인을 설정할 수없는 것을 보지 못했습니다. 나는 Obj-C에 약간 새로운 편이지만, 위임자를 이해하는 한 너무 비 정설적이어서는 안된다.

참고 : 3.0에서는 흔들기 알림을 수신 할 수 있음을 알고 있습니다. 불행히도, 나는 그저 쉐이크에 관심이있는 모든 시간 동안 첫번째 응답자가 될 다른 뭔가가 필요합니다. 그래서 나는 그 옵션을 리펙토링 할 수 없습니다.

답변

2

일반적으로 대리인이있는 개체는 한 번에 하나씩 만 있습니다. 별도로 문서화되어 있지 않은 한, 특정 인스턴스의 수명 기간 동안 하나 이상의 다른 개체를 대리인으로 설정하는 데 대한 제한 사항이 없어야합니다.

뒤에 가속 컨트롤러 위임자로 첫 컨트롤러가 설정되어 있는지 궁금합니다. 디버거로 코드를 보면서 기대했던 순서대로 모든 일이 일어나는지 확인 했습니까?

+0

+1 좋은 지적. 나는 그것을 지금 시험해보고 다시보고 할 것이다. – Bdebeez

+0

그래, 그랬어. 컨트롤러가 릴리스되었지만 (0까지) 즉시 dealloc되지 않았습니다. 따라서 제 2의 컨트롤러가 생성 될 때까지는 속성을 제외하지 않았습니다. 감사합니다. – Bdebeez

2

가능한 해결책은 다른 응용 프로그램 대리인이 UIAccelerometer의 대리자 역할을 수행하고 accelerometer:didAccelerate: 메시지를 받으면 해당 클래스에서 NSNotification을 사용자 지정으로 보내도록하는 것입니다. 관심있는 가속 유형을 감지하거나 매번 알림을 보낼 수 있고 알림 userInfo의 일부로 UIAcceleration 매개 변수를 포함 할 때만 메시지를 보낼 수 있습니다. 가속 데이터에 관심이있는 컨트롤러는 필요에 따라 알림에 등록 할 수 있습니다.

+0

AppDelegate의 옵션에 대해 생각해 봤지만 알림을 통해 생각하지 않았습니다. 훌륭한 아이디어입니다. 감사합니다. 나는 그렇게 할 필요가 없길 바랄 뿐이지 만, 필요한 경우 해결할 수있는 해결 방법입니다. – Bdebeez