2011-12-29 10 views
4

最新のSDK、Xcode 4.2およびARCを使用してiOS 4アプリケーションを開発しています。セレクタの既知のインスタンスメソッドがありません

は私がappDelegate.h

#import <UIKit/UIKit.h> 

@class ViewController; 
@class SecondViewController; 

@interface AppDelegate : UIResponder <UIApplicationDelegate> 
{ 
    UINavigationController* navController; 
    ViewController* viewController; 
    SecondViewController* secondViewController; 
} 

@property (strong, nonatomic) UIWindow *window; 

- (void) showSecondViewController; 

@end 

にメソッドを追加しましたそして、私は

- (IBAction)goSecondClicked:(id)sender 
{ 
    [[[UIApplication sharedApplication] delegate] showSecondViewController]; 
} 
ViewController.m

にそのメソッドにメッセージを送信するときには、 appDelegate.m

#import "AppDelegate.h" 

#import "ViewController.h" 
#import "SecondViewController.h" 

@implementation AppDelegate 

@synthesize window = _window; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    viewController.title = @"First"; 
    navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 
    self.window.rootViewController = navController; 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    ... 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    ... 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    ... 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    ... 
} 

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    ... 
} 

- (void) showSecondViewController 
{ 
    secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
    secondViewController.title = @"Second"; 
    [navController pushViewController:secondViewController animated:YES]; 
} 

@end 

で実装しかします

次のコンパイラエラーが発生します。

自動リファレンスカウント問題 'showSecondViewController'

どれ手がかりセレクタのは知られていないインスタンスメソッド?

答えて

5

あなたがあなたに取得する委譲オブジェクトにキャストする必要があります。

- (IBAction)goSecondClicked:(id)sender 
{ 
    [[[UIApplication sharedApplication] delegate] performSelector:@selector(showSecondViewController)]; 
} 

EDIT:

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 

が続いてこれにあなたのgoSecondClickedアクションメソッドを変更appDelegate

3

上のメソッドを呼び出すことが:この代替案は特定の状況では機能しますが、メソッド名を変更するとコンパイラが助けにならないことに注意してくださいあなたの代理人で、セレクタコールの名前を変更することを忘れないでください。したがって、これは慎重に使用する必要があります。

+0

は、私は本当にdownvotersは常に彼らの理由を説明することを望みました...最高の解決策ではありませんが、私の答えが働きます。 –

1

また、あなたはとあなたのセレクタを起動することができ、この後、あなたのAppDelegate.h

#define APP_DELEGATE (AppDelegate *)[[UIApplication sharedApplication] delegate] 

にこのマクロを定義することができます。

[APP_DELEGATE showSecondViewController]; 
関連する問題