2

FirstViewController.xibとSecondViewController.xibを提供する新しい「タブバーアプリ」プロジェクトを作成しました。

AppDelegateタブバーでは、コントローラーは次のように構成されています。

UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
self.window.rootViewController = self.tabBarController;

これは明らかにnibファイルからのインスタンスをロードしますUIViewControllerね。しかし、SecondViewController.xibを開くと、表示されるルートレベルのオブジェクトはビューコントローラーのビューだけです。UIViewControllerインスタンス全体が実際にはそのペン先から出ていると私は信じているので、これは私には意味がありません。

残りはどこですか?UIViewControllerタイトルなどのプロパティが表示されないのはなぜですか?[ファイル所有者]をクリックすると、[ID]タブに「SecondViewController」と表示されるので、ファイル所有者は間違いなくですがUIViewController、nibにアーカイブされていないようです。実際、インスタンスはプログラムで作成されているようで、nibはビューのみをアーカイブしているようです。

nibファイルの名前がSecondViewController.xibであるため、混乱を招きます。誰かが明確にすることができますか?

4

3 に答える 3

2

オブジェクトが「nibファイルの所有者」である場合、これは、nibがロードされる前にオブジェクトがすでにインスタンス化されている(必ずしも「初期化」されているとは限らない)ことを意味します。ペン先をロードすると、所有者は作成されません。所有者にコンセントを接続するだけです。

IBの[プロパティ]パネルを使用してinitWithNibNameを介して初期化されたビューコントローラのプロパティの初期値を設定できないことは混乱を招くことに同意します。

ただし、ファイル所有者のIBにある[ユーザー定義のランタイム属性]パネルを使用して、ファイル所有者にプロパティ値を設定できると思います(XCode 4.2以降、iOS5以降のみ)。

于 2012-10-08T16:30:37.250 に答える
1

オブジェクトセクションにあるプロパティの一部のみを表示/変更できます。Object

通常、オブジェクトセクションにあるオブジェクトIBoutletはファイル所有者(UIViewControllerあなたの場合)として設定されます。UIViewControllerオブジェクトセクションにドラッグすると、それを編集することもできますが、ファイル所有者について話しているときに、その変数/プロパティを設定できます。 /methodsおよびまたはのいずれIBOutletsかである変数/properties/methodsのみIBAction

タイトルなどを設定したい場合は、コードで手動で設定する必要があります。

于 2012-10-08T16:30:26.180 に答える
1

実際、SecondViewControllerのインスタンスはSecondViewController.hから来ています。initWithNibName:@ "SecondViewController"を使用すると、ペン先とそのプロパティが読み込まれますが、これらのオブジェクトのいずれかを変更する場合は、InterfaceBuilderを使用してSecondViewControllerに接続する必要があります。

問題を再現すると、次のビューでSecondViewController.xibを取得できます。

ビューラベル-2番目のビューテキストビュー

SecondViewController.mを見ると、メソッドのタイトルが変更されていることがわかります。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Second", @"Second");
        self.tabBarItem.image = [UIImage imageNamed:@"second"];
    }
    return self;
}
于 2012-10-08T16:31:16.577 に答える