1

プッシュされたセルから別のビューに移動するためにdidSelectRowAtIndexPathを使用するテーブル コントローラーがあります。その中で、新しいView Controllerを初期化し、それにいくつかのデータをプッシュします。その後、pushViewControllerを実行します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    ServicesModel *service = [services objectAtIndex:indexPath.row];
    ServiceViewController *serviceViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ServiceView"];

    serviceViewController.serviceModel = service;
    NSLog(@"Set model %@", service.title);

    // Pass the selected object to the new view controller.
    [self.serviceController pushViewController:serviceViewController animated:YES];
}

私のServiceViewControllerには、選択したサービスのラベルserviceTitleServiceModelプロパティがあります

@property (weak, nonatomic) IBOutlet UILabel *serviceTitle;
@property (strong, nonatomic) ServiceModel *serviceModel;

viewDidLoadを使用して、ラベルのテキストを変更しようとしています

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    NSLog(@"viewDidLoad %@", self.serviceModel.title);
    self.serviceTitle.text = self.serviceModel.title;
}

また、 viewDidAppearでモデルにアクセスしようとしています

- (void) viewDidAppear:(BOOL)animated
{
    NSLog(@"viewDidAppear %@", self.serviceModel.title);
}

ビューが開くと、ラベルは空です。なんで?私は何を間違っていますか?最も奇妙なのはログです:

(-[ServiceViewController viewDidLoad]) (ServiceViewController.m:43) viewDidLoad (null)
(-[ServicesTableViewController tableView:didSelectRowAtIndexPath:]) (ServicesTableViewController.m:127) Set model Google.com
(-[ServiceViewController viewDidAppear:]) (ServiceViewController.m:36) viewDidAppear (null)

モデル プロパティを割り当てる前に、 viewDidLoadが起動することがわかります。そしてviewDidAppearモデルのプロパティはまだnullです。それはどのようにできますか?

4

2 に答える 2

2

2 つの問題があります。最初のものは、0x7fffffff が述べたように、コントローラーを正しくインスタンス化していないことです (xib で作成された場合は initWithNibName:bundle: である必要があり、ストーリーボードの場合は 0x7ffffffff のように)。

次に、ビューがまだロードされていないため、didSelectRowAtIndexPath から serviceViewController のラベルにアクセスできません。したがって、didSelectRowAtIndexPath でラベルを設定する代わりに、serviceViewController に文字列プロパティを設定し、それに値 service.text を指定する必要があります。次に、viewDidLoad で、ラベルにその文字列を入力できます。

于 2013-08-29T23:08:13.020 に答える
1

ラベルが完全に欠落していますか、それともラベルが表示されていて、更新されたテキストを受信して​​いないだけですか? ラベルがない場合は、View Controller の作成方法に問題がある可能性があります。たとえば、ストーリーボードを使用している場合は、次のようにビュー コントローラーにアクセスする必要があります。

ServiceViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeStoryBoardID"];

これの代わりに:

ServiceViewController *serviceViewController = [[ServiceViewController alloc] init];

ただし、ラベルは表示されているが、テキストが更新されていない場合は、最初に Interface Builder の接続インスペクターを調べて、ラベルの IBOutlet が適切にリンクされていることを確認してください。

于 2013-08-29T21:05:42.333 に答える