0

完了ボタンのあるナビゲーション バーと 2 つのテキスト フィールドを持つビュー コントローラーがあります。完了ボタンが押されると、メソッドpostInfoが呼び出されます。実装は次のとおりです。

- (void)postInfo{
ListingViewController* lvc = [[ListingViewController alloc] init];

NSString* listingName = listingNameField.text;
NSString* listingPrice = listingPriceField.text;

NSLog(@"%@", listingName);
NSLog(@"%@", listingPrice); 

[lvc.titleLabel setText:listingName];
[lvc.priceLabel setText:listingPrice];

[self.navigationController pushViewController:lvc animated:YES]; 

}

ここにListingViewController.h

#import <UIKit/UIKit.h>

@interface ListingViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;

@end

UILabel は xib ファイルを介して設定され、空です。リクエストに応じて、他のコードが必要な場合は投稿します。

4

4 に答える 4

1

そのプッシュを行った時点では、次のコントローラーのビューはまだ読み込まれていないため、そのビューにアクセスすることはできません。ListingViewController で NSString プロパティを作成し、postnfo メソッドでそれらに文字列を渡す必要があります。次に、ListingViewController の viewDidLoad メソッドで、これらのプロパティを使用してラベルを設定します (これは、viewDidLoad が実行されるまでに読み込まれます)。

于 2013-07-20T20:44:34.100 に答える
1

コードをこれに変更します。

- (void)postInfo
{
  ListingViewController* lvc = [[ListingViewController alloc] init];
  [lvc view];    // loads the view 

  NSString* listingName = listingNameField.text;
  NSString* listingPrice = listingPriceField.text;

  NSLog(@"%@", listingName);
  NSLog(@"%@", listingPrice); 

  [lvc.titleLabel setText:listingName];
  [lvc.priceLabel setText:listingPrice];

  [self.navigationController pushViewController:lvc animated:YES]; 
}

これは、ビュー コントローラーのビュー プロパティにアクセスするまで、ビューが読み込まれず、すべてのサブビューが nil であるために発生します。それらは、プッシュされているView ControllerでviewDidLoadが呼び出された後に構成できます。を呼び出す[lvc view]と、すぐにビューが読み込まれます。

于 2013-07-20T20:47:47.910 に答える
0

私も通常これを取得します(セグエを使用する場合の例で)。duringのNSString代わりにプロパティを設定することで回避します。次に、次のビュー コントローラーで、プロパティの値を取得し、.IBOutletprepareForSeguedestinationControllerviewDidLoadUILabel

この回答の説明が役に立つかもしれません: https://stackoverflow.com/a/8094146/2358334

呼び出した行の直後にブレークポイントを設定した場合

testViewController *viewController = segue.destinationViewController;

プロジェクトをビルドして実行すると、destinationViewController の UITextField プロパティが割り当てられておらず、ブレークポイントで開始されていないことがわかります (メモリは 0x0)。一方、NSString プロパティは既に割り当てられ、初期化されています (その値を設定できます)。

于 2013-07-20T20:38:35.107 に答える
0

これをやってみてください

最初にビューをロードする必要があり(viewcontrollerをプッシュします)、次にプロパティにアクセスできます(IBOutletによってビューを作成したため)

- (void)postInfo{
    ListingViewController* lvc = [[ListingViewController alloc] init];

    NSString* listingName = listingNameField.text;
    NSString* listingPrice = listingPriceField.text;

    NSLog(@"%@", listingName);
    NSLog(@"%@", listingPrice); 

    [self.navigationController pushViewController:lvc animated:YES];

    [lvc.titleLabel setText:listingName];
    [lvc.priceLabel setText:listingPrice]; 

}

于 2013-07-20T20:49:50.040 に答える