2009-12-07 5 views
1

obj C를 처음 사용했습니다. AS3.0 배경에서 왔습니다. 기본적으로이 응용 프로그램에서는 응용 프로그램 대리인의 applicationWillResignActive를 사용하여 들어오는 호출에 반응합니다. 나는 (선택 기본적으로 xcode 제공되는 템플릿) 다른보기를 트리거하는 테이블보기 navigationController가있다 행 선택에서로드 된 가져옵니다 내 AnotherViewController보기에서 메서드가 있습니다. 그 방법은 거기에서 내 라벨을 "지금 전화하기"로 바꿀 것입니다. 내 applicationWillResignActive에서 나는이 메서드를 호출하고 잘 작동하지만 UIViewController가 handleIncomingCall에 응답하지 못할 수도 있다는 귀찮은 경고 메시지가 표시되지만 괜찮게 컴파일되고 응답합니다. 이 경고 표지를 제거하려면 어떻게해야합니까?응용 프로그램 대리자에서 viewController로 메시지 보내기

-(void) applicationWillResignActive:(UIApplication *)application { 
    NSLog(@"CALL COMIN IN"); 
    UIViewController *vc = [navigationController visibleViewController]; 
    [vc handleIncomingCall]; 
    [vc release]; 
} 

미안 해요 ... 여기를 포맷하는 방법을 알아 내려고 노력하고있어 당신이 개체가있는 UIViewController이다 컴파일러를 말하고 있기 때문에

답변

0

이유이며 handleIncomingCall 참으로하지 않습니다 UIViewController 메서드입니다. 당신은 .h 파일을 포함하는 경고를 제거하고 객체를 AnotherViewController로 정의 할 수 있습니다. 대리자는 .h 파일에서 handleIncomingCall이 해당 클래스의 메서드이므로 해당 경고를 제공하지 않습니다.

Obj-C는 강력한 형식의 언어가 아니기 때문에 컴파일됩니다. UIViewController로 변수를 정의하더라도 실제로는 적절한 메시지에 응답하는 자체 유형의 변수이기 때문에 작동합니다. 그러나 컴파일러가 이것을 컴파일 할 때 알 수있는 방법은 없습니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 이것은 내가 가지고있는 곳입니다. 사실 UIViewController에서 내 메서드를 호출하려고 했으므로 AnotherViewController로 캐스팅했습니다. 문제는 AnotherViewController뿐 아니라이 이벤트 중에 모든 수의보기 컨트롤러가 표시 될 수 있다는 것입니다. 내가 이것을 쓸 수있는 방법에 대한 제안? 현재 볼 수있는 유형을 확인하고 그에 따라 행동하는 방법은 무엇입니까? – bmanderscheid

0

OK, 그래서 나는이 일을 해요 :

AnotherViewController *vc = (AnotherViewController *) navigationController.visibleViewController; 
    if ([vc isKindOfClass:[AnotherViewController class]]){ 
     [vc handleIncomingCall]; 
    } 
    else{ 
     NSLog(@"NOT ANOTHER VIEW CONTROLLER DO NOTHING"); 
    } 

이이 응용 프로그램을 위해 큰 일을 할 것이다, 나는 그냥 그 방법으로 여러 뷰가 있었고, 당신이 원한다면 당신이 그것을 처리 할 방법 궁금하네요 불러라. if 문에 여러개의 ||를 추가한다고 생각지 않습니다. 내가 거기에 갈 때 나는 그 다리를 건너 죠. 도와 주셔서 감사합니다!

0
  1. 각 클래스에 원하는 방식으로 하위 클래스를 지정하고 공통 클래스로 호출하면 메시지가 전달됩니다.

  2. 가장 간단한 해결책은 NSNotificationCenterexample입니다. 테스트를 거쳐 작동합니다.

  3. 내가 다른 방식으로 다른 작업을 수행해야했습니다.

appDelegate에서 handleVC1, handleVC2 등 메소드를 만듭니다.

viewWill 응답해야하는 각 viewcontroller에 appDelegate에 visibleID (모든 종류의) 객체를 설정합니다.

applicationWillResignActive에서 ID를 사용하여 적절한 메소드를 호출하십시오. 그들은

-(void)handleVC1 {[vc1 handleIncomingCall];} 

-(void)handleVC2 {[vc2 handleIncomingCall];} 

수 그러나 처리는 각각의 ViewController 내에서 수행 할 필요가없는 경우, handleVC1, handleVC2 등의 코드가 완전히 AppDelegate에 작성 여전히 다소 "적응"할 수있을 수 있습니다.

일반적으로 @class vc1 (등) ... IBOutlet ... mainwindow.xib에 추가하고 연결하십시오.그런 식으로 각각의 viewcontroller에 대해 초기화 된 객체가 1 개 있고 필요가 발생할 경우 원하는 모든 작업을 수행 할 수 있습니다. 표준 절차 :)

내가 생각하는 것 중 하나가 당신을 고쳐야한다.

0

이렇게하면됩니다. 응용 프로그램의 위임에

나는 내가 이런 짓을 메시지를받을 싶어 뷰 컨트롤러에 다음 뷰 컨트롤러

#import <UIKit/UIKit.h> 
#import "MyViewController.h" 

@interface AppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> { 

    UIViewController *myViewController; 


} 

@property (nonatomic, assign) UIViewController *myViewController; 


@end 

에 대한 속성을했다.

AppDelegate *theAppDelegate = (AppDelegate*) [UIApplication sharedApplication].delegate; 

theAppDelegate.myViewController = self; 

그런 다음 응용 프로그램 대리인으로부터 viewController로 메시지를 쉽게 보낼 수 있습니다.

이 답변에 상속 문제가 있는지 알려 주시기 바랍니다. 그것은 나를 위해 작동 ...

0

나는 이것이 오래된 질문이지만, 이것이 나를 위해 작동하는 것 알아요. AppDelegate.m에서

:

#import "ViewController.h" 

- (void)applicationWillResignActive:(UIApplication *)application { 
    ViewController *viewController = (ViewController *)self.window.rootViewController; 
    [viewController test]; // Implement this in ViewController 
} 

그리고 구현 - (무효) 시험; 의 ViewController에서 이것은 당신이 다른 더에 메시지를 보낼 수 있습니다 거기에서, 뷰 컨트롤러에 메시지를 전송하는 방법의 단순한 예입니다

- (void)test 
{ 
    NSLog(@"Test Successful"); // If all goes well, this will be printed when app resigns being active 
} 

(너무 ViewController.h에 추가하는 것을 잊지 마세요) UIViewController 인스턴스.

관련 문제