1

まったく同じコードでこれを何度も実行しましたが、何らかの理由で今日は機能しません。

 ExampleViewController1 *exampleView = [[ExampleViewController1 alloc] initWithNibName:@"ExampleViewController1" bundle:nil];
 [exampleView setProjectName:[[self.projectListArray objectAtIndex:indexPath.row] objectForKey:@"name"]];
 NSLog(@"%@", [[self.projectListArray objectAtIndex:indexPath.row] objectForKey:@"name"]);
 XAppDelegate.stackController pushViewController:exampleView fromViewController:nil animated:YES]

私のNSLogプリントアウトは適切です。

My ExampleViewController1.h次のように宣言されたファイル:

@property(nonatomic, strong) NSString *projectName; 

次に、このコードを で実行しExampleViewController1.mます

 -(void)viewDidLoad {
     NSLog(@"%@", self.projectName);
     self.projectNameLabel.text = self.projectName;
     [super viewDidLoad];
 }

私の結果NSLogは興味深いものです。私のNSLogからは、viewDidLoad私の他のものの前に呼び出されているようです:

 2012-04-22 10:59:41.462 StackedViewKit[43799:f803] (null)
 2012-04-22 10:59:41.463 StackedViewKit[43799:f803] NewTest

(null)からの値があることを確認しましたNSLog(@"%@", self.projectName);が、それは 2 番目に呼び出されたはずNSLogです... なぜ最初に来るのかわかりません。

誰かがこのコードをリクエストしました:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
   if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {

    // random color
    self.view.backgroundColor = [UIColor colorWithRed:((float)rand())/RAND_MAX green:((float)rand())/RAND_MAX blue:((float)rand())/RAND_MAX alpha:1.0];
   }
  return self;
}
4

2 に答える 2

2

viewDidLoadは、initWithNibNameの直後ではなく、ViewControllerが初めて表示される前に呼び出されます。

> viewDidLoadメソッドは、ViewControllerがビュー階層をメモリにロードした後に呼び出されます。このメソッドは、ビュー階層がnibファイルからロードされたか、loadViewメソッドでプログラムによって作成されたかに関係なく呼び出されます。

>initWithNibName指定したnibファイルはすぐにはロードされません。ビューコントローラのビューに初めてアクセスしたときにロードされます。nibファイルのロード後に追加の初期化を実行する場合は、viewDidLoadメソッドをオーバーライドして、そこでタスクを実行します。

アプリデリゲートを使用して、あるデータから別のデータにデータを渡すことができます。これは、別の代替ソリューションです。

you do in initWithNibName method itself. or in viewDidAppear.

initWithNibNameメソッドは、@schコメントのように次のようになります。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 

     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil] //just set it here first and then check

     if (self) { 
         // do something here; 
         } 
return self; 
}

コンストラクターで何をする必要があるのか​​、viewDidLoadで何をする必要があるのか​​(メモリにロードされた後)を考えるのに十分賢い必要があります。

于 2012-04-22T16:16:39.247 に答える
2

予想通り、問題はself.view初期化メソッド内にアクセスしようとしていることです。したがって、行self.view.backgroundColor = ...viewDidLoadメソッドに移動します。

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"%@", self.projectName);
    self.projectNameLabel.text = self.projectName;
    self.view.backgroundColor = [UIColor colorWithRed:((float)rand())/RAND_MAX green:((float)rand())/RAND_MAX blue:((float)rand())/RAND_MAX alpha:1.0];
}

実際、viewプロパティのドキュメントには次のように記載されています。

このプロパティにアクセスし、その値が現在 nil の場合、View Controller は自動的に loadView メソッドを呼び出し、結果のビューを返します。

そのため、初期化メソッドを呼び出すself.viewと、View Controller は (nib から、またはloadViewメソッドを使用して) ビューをロードする必要があります。そして、それが呼ばれる理由viewDidLoadです。

于 2012-04-22T16:42:38.243 に答える