0

[これは機能していますが、機能させるための「修正」がなぜ機能したのかわかりません。]

学習演習の一環として、簡単な表を作成しています。ユーザーがテーブル内のセルを選択すると、2 番目の UIViewController に移動します。2 番目の UIViewController には、選択したセルのテキストを表示するラベルがあります。

「親」クラスには、子を作成してテキストを設定する次のメソッドがあります。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  child = [[WDRViewControllerFirstChild alloc] initWithNibName:nil bundle:nil];
  child.title = [colors objectAtIndex:indexPath.row];
  child.labelText = [colors objectAtIndex:indexPath.row];
  [self.navigationController pushViewController:child animated:YES];  
}

次に、WDRViewControllerFirstChild には 2 つのメソッドがあります。このようにアプローチすると、すべてが機能します。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
      label = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 50)];
      colorMap = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil] forKeys:[NSArray arrayWithObjects:@"red", @"green", @"blue", nil]];
//      Adding the subview here won't work.  Why?
//      [self.view addSubview:label];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
  [self.view addSubview:label];
  label.text = labelText;
  label.textAlignment = UITextAlignmentCenter;
  label.backgroundColor = [UIColor whiteColor];
  self.view.backgroundColor = [colorMap objectForKey:labelText];
}

もともと、init呼び出しで子をサブビューに割り当てましたが、うまくいきませんでした。つまり、テキストのラベルは、選択された項目のテキストを正しく表示しません。(空白になります。)

いくつかの NSLog 呼び出しを追加し、さらに、addSubview 呼び出しを viewDidLoad から init に移動すると、labelText の値が null になることがわかりました。ただし、上記のフォームでは、適切に設定されています。

私はそれが機能していることをうれしく思いますが、一方が機能し、他方が機能する理由がわかりません。特に、addSubview を呼び出す場所に基づいて labelText の設定が機能する理由が本当にわかりません。

洞察はありますか?

4

1 に答える 1

1

-addSubviewビューが実際に XIB から完全にロードされている場合にのみ機能し、そうでない場合は nil への呼び出しを送信し、nil を生成します。が呼び出されるまで-initWithNibName:bundle:に、OS は指定した XIB を (文字通り) 解凍してセットアップする可能性が高いため、view プロパティは nil です。ビューの存在について合理的に-viewDidLoad確信できるので、ほとんどのセットアップ作業はそこで行われます。(NULL) ラベル テキストについては、iVarlabelTextが何であれ、インスタンス化しませんでした。その行を削除します。

于 2012-05-13T19:24:43.000 に答える