1

私は Xcode 4.3.2 で作業しています。

ストーリーボードを使用する代わりに、プログラムで Nib を読み込もうとしています。ストーリーボードはもっとシンプルに見えますが、残念ながら iOS 4 と互換性がなく、下位互換性が必要なアプリケーションを構築しています。

ここに私の問題があります: メイン ビュー (背景が緑色の単純なビュー) を読み込もうとしています。現在、デフォルトのビューはありません。

私のファイルは次のとおりです。

AppDelegate.h/.m GreenViewController.h/.m SwitchViewController.h/.m

アプリの開始時に緑色の画面をロードしたいので、 AppDelegate.m に次のものがあります。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.switchViewController = [[SwitchViewController alloc] initWithNibName:@"GreenView" bundle:nil];

    //UIView *switchView = self.switchViewController.view;


    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

SwitchViewController.m には次のものがあります。

- (void)viewDidLoad
{
    self.greenViewController = [[GreenViewController alloc] initWithNibName:@"GreenView" bundle:nil];
    [self.view insertSubview:self.greenViewController.view atIndex:0];
    [super viewDidLoad];
}

単純な initWithNibName にデフォルト コードを入力します。

GreenViewController.m には次のものがあります。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

これがすべての主な機能です。アプリを実行すると、すぐにエラーが発生します。

2012-10-09 12:34:35.586 MyViewSwitcher[5210:f803] -[AppDelegate setSwitchViewController:]: unrecognized selector sent to instance 0x6c6c310
2012-10-09 12:34:35.587 MyViewSwitcher[5210:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate setSwitchViewController:]: unrecognized selector sent to instance 0x6c6c310'

誰かが私のエラーの原因を理解するのを手伝ってもらえますか? GreenView.xib の「カスタム クラス」が Identity Inspector の「GreenViewController」であることを確認しました。また、「View」の参照元がファイルの所有者であることを確認しました。アプリの起動時に GreenView nib をロードしたいと考えています。最終的にはボタンを追加してビューを切り替えますが、今のところメイン ビューをロードすることさえできていません。何を誤解しているのかわかりません。

助けてくれてありがとう!

4

3 に答える 3

1

問題はペン先のロードではありません。問題はこの行にあります:

self.switchViewController = [[SwitchViewController alloc] initWithNibName:@"GreenView" bundle:nil];

ここでは、 「Objective-Cプログラミング言語」で説明されている「ドット構文」を使用しています。その構文を使用してプロパティを設定すると、コンパイラはそれを次のような通常のObjective-Cメッセージに変換します。

[self setSwitchViewController:[[SwitchViewController alloc] initWithNibName:@"GreenView" bundle:nil]];

実行時に、システムはAppDelegateオブジェクトがメソッドを理解していないことを通知しますsetSwitchViewController:@synthesizeディレクティブを使用する必要があります。これは、 Objective-Cプログラミング言語で説明されており、コンパイラにsetSwitchViewController:メソッドを実装するように指示します。

@synthesize switchViewController = _switchViewController;
于 2012-10-09T21:40:04.820 に答える
0
  1. 使用する前に、UIWindow持っていることを確認してくださいrootViewControllermakeKeyAndVisible

    [self.window setRootViewController:self.switchViewController]; [self.window makeKeyAndVisible];

  2. 上記の手順に従って、プロパティが合成されていることを確認します。

  3. のようにサブクラスでメソッドを実装する場合SwitchViewController.m、いつメソッドを呼び出すsuperかが重要です。特別な意図がない限り、ほとんどの場合、super実装の呼び出しはローカルself実装よりも優先されます。したがって、次のように変更- (void)viewDidLoadすることをお勧めしますSwitchViewController.m

    • (void)viewDidLoad { [super viewDidLoad];

      self.greenViewController = [[GreenViewController alloc] initWithNibName:@"GreenView" bundle:nil];

      [self.view insertSubview:self.greenViewController.view atIndex:0]; }

于 2012-10-10T01:25:07.473 に答える
0
 '-[AppDelegate setSwitchViewController:]: unrecognized selector sent to instance 0x6c6c310'

setSwitchViewController:AppDelegateに/でメッセージを送信しています(メソッドを呼び出しています) 。それが問題です。

于 2012-10-09T19:47:32.763 に答える