2011-01-22 3 views
0

처음 iPad 프로젝트에서 설정 한 방식대로 일반 메서드 호출이 내가 생각하는 방식으로 작동하지 않는 이유가 궁금했습니다.Button은 다른 클래스의 메서드를 호출하지만 일반 메서드 호출은 수행되지 않습니다

mainMenuAppDelegate *del = (mainMenuAppDelegate *)[[UIApplication sharedApplication] delegate]; 

그리고이 같은 버튼을합니다 :

나는이 같은 위임 포인터를 만들 initWithFrame 내부의 관점에서

,

CGRect backBTNFrame = CGRectMake(25, 30, 140, 52); 
    backButton_video = [[UIButton alloc] init]; 
    backButton_video.frame = backBTNFrame; 
    backBtnImg_video = [UIImage imageNamed:@"SHIP_button_back.png"]; 
    [backButton_video setImage:backBtnImg_video forState:UIControlStateNormal]; 
    backButton_video.backgroundColor = [UIColor clearColor]; 
    [self addSubview:backButton_video]; 

[backButton_video addTarget:self 
    action:@selector(kill_timers) 
    forControlEvents:UIControlEventTouchUpInside]; 

[backButton_video addTarget:del.switchVC 
    action:@selector(gotoMain) 
forControlEvents:UIControlEventTouchUpInside]; 

나는 버튼을 클릭 그것은에서 메소드를 호출 보기 컨트롤러 :

- (void)gotoMain{ 

NSLog(@"switch to main"); 

for(UIView *v in [containerView subviews]) { 
    [v removeFromSuperview]; 
} 

MainMenu *mainMenu = [[MainMenu alloc] init]; 
mainMenu.frame = CGRectMake(0, -20, 1024, 768); 
[containerView insertSubview:mainMenu atIndex:0]; 
[mainMenu release]; 
} 

이것은 내가 본 화면을 없애고 기본 메뉴보기를 추가합니다. . 이것은 잘 작동합니다. 나는 그것이 전이었고, 자기 방식 kill_timers와 뷰 컨트롤러 방법 gotoMain를 호출하는 방법과 같은 위임 포인터를 만들 경우

그러나, 그것은 작동하지 않습니다

mainMenuAppDelegate *del = (mainMenuAppDelegate *)[[UIApplication sharedApplication] delegate]; 

[self kill_timers]; 

[del.switchVC gotoMain]; 

을 콘솔에서 나는 메시지가 표시 그 타이머를 죽이는데, 그렇지만 NSLog는 뷰 컨트롤러에서 작동 할 준비가되어 있지만 아무 것도 나타나지 않습니다. 그냥 일어나지 않습니다. 모든 단서? 왜 버튼과 정규 메소드 호출이 다르게 동작할까요?

답변

1

그 자기는

[self kill_timers];
에서 문자 그대로 그 물건 (자기)이 무엇인가를해야한다는 것을 의미합니다. 당신이 정말로하고 싶은 것은 당신의 대의원에게 무엇인가를하게하는 것입니다. 이것은 좋은 디자인 습관이 아닙니다.

대리인이 수행하도록하려면 NSNotificationCenter를 사용하십시오. 그런 다음

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(kill_timers)
name:@"Kill Timers" object:nil];

,이 생성 된 관찰자 전화를 걸 : 여러 인스턴스를 갖는 관련된 지저분한 설계 결함없이,


[[NSNotificationCenter defaultCenter] postNotificationName:@"Kill Timers" object:nil]; 

이이 방법을 발사됩니다 AppDelegate에의 아래 applicationDidFinishLaunching에서

귀하의 AppDelegate.

+0

감사합니다. 나는 당신이 오해했을 수도 있지만 대답은 여전히 ​​적용될 수 있다고 생각합니다. kill_timers는 동일한 클래스 내에서 호출되어야합니다. 다른 클래스에서 호출해야하는 gotoMain입니다. 나는 내일에 도착해서 그것이 효과가 있는지 알려줄 수 있어야한다. – VagueExplanation

+0

오 .. 남자 .. 오 남자 !!! 그것은 작동합니다. 그러나 약간 다른 방식으로. 필자는 실제로 뷰 컨트롤러에 추가 된 뷰 컨트롤러에서이 메서드를 호출하기를 원했습니다. 그래서 뷰 ​​컨트롤러의 loadView에 알림 관찰자를 추가했습니다. 그런 다음 전화를보기에 넣습니다. 너무 굉장한 작품. A +++ – VagueExplanation

관련 문제