1

私はobj Cが初めてで、AS3.0のバックグラウンドから来ました。基本的に、私が作成しているこのアプリでは、アプリのデリゲートで applicationWillResignActive を使用して、入ってくる呼び出しに反応しています。選択時に別のビューをトリガーするだけのテーブルビューを持つnavigationControllerがあります(基本的にxcodeで提供されるテンプレート)、AnotherViewControllerビューに行選択からロードされるメソッドがあります。そのメソッドは(今のところ)そこにある私のラベルを「着信中」に変更します。私のapplicationWillResignActiveでこのメソッドを呼び出していますが、正常に動作しますが、UIViewControllerがhandleIncomingCallに応答できない可能性があるという迷惑な警告が表示されます...しかし、正常にコンパイルされ、応答します。この警告サインを取り除くにはどうすればよいですか?

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

申し訳ありませんが、ここでフォーマットする方法を見つけようとしています...

4

5 に答える 5

0

その理由は、オブジェクトがUIViewControllerのものであり、handleIncomingCallが実際にはUIViewControllerのメソッドではないことをコンパイラーに指示しているためです。.hファイルを含め、オブジェクトをAnotherViewControllerまたはそれを呼び出すことになったものとして定義することで、警告を取り除くことができます。デリゲートは、.hファイルで、handleIncomingCallがそのクラスのメソッドであることがわかるため、警告の表示を停止します。

Obj-Cは強く型付けされた言語ではないため、コンパイルされます。変数をUIViewControllerとして定義しても、実際には適切なメッセージに応答する独自のタイプであるため、これは機能します。しかし、コンパイラがコンパイル時にこれを知る方法はありません。

于 2009-12-08T17:25:37.570 に答える
0

これは古い質問であることは知っていますが、これは私にとってはうまくいくようです。

AppDelegate.m で:

#import "ViewController.h"

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

そして - (void)test; を実装します。ViewController 内 (ViewController.h にも追加することを忘れないでください)

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

これは、View Controller にメッセージを送信する方法の簡単な例にすぎません。そこからさらに他の UIViewController インスタンスにメッセージを送信できます。

于 2014-10-16T11:06:59.803 に答える
0
  1. サブクラス化して各 vc に好きなメソッドを与え、それらを共通クラスで呼び出すと、メッセージは下に渡されます。

  2. 最も速い解決策は、この単純なNSNotificationCenter です。テスト済みで動作します。

  3. 他のことをする必要があったので、別の方法で行いました。

appDelegate で handleVC1、handleVC2 などのメソッドを作成します。

応答する必要がある各ビュー コントローラーの viewWillAppear で、appDelegate にオブジェクトの visibleID (任意の種類) を設定します。

applicationWillResignActive では、ID を使用して適切なメソッドを呼び出します。彼らは可能性があります

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

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

ただし、その処理を各ビューコントローラー内から行う必要がない場合は、handleVC1、handleVC2 などのコードを完全に appDelegate に記述して、多少「適応」させることができます。

私は通常 @class vc1 (etc) ... IBOutlet ... とにかく mainwindow.xib に追加して接続します。そうすれば、ビューコントローラーごとに1つの初期化されたオブジェクトがあり、必要に応じてそれらを使って好きなことをすることができます。標準手順 :)

これらのうちの1つがあなたを修正するはずです。

于 2011-05-31T09:09:18.983 に答える
0

OK、だから私はこれをやっています:

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

これは、このアプリケーションではうまく機能します。そのメソッドで複数のビューがあり、それを呼び出したい場合、どのように処理するのだろうかと思っています。|| を if ステートメントに追加するとは思えません。そこに着いたら、その橋を渡ります。助けてくれてありがとう!!

于 2009-12-08T18:10:22.040 に答える
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 にメッセージを簡単に送信できます。

この回答に継承の問題があるかどうか教えてください。わたしにはできる...

于 2011-06-29T13:40:56.487 に答える