6

ViewController B を A から Navigation Controller にプッシュし、B のいくつかのプロパティを A に割り当てようとしました。
この場合、プロパティの割り当てが完了してから、viewcontroller A の viewDidLoad が実行されました。

ここで、A のプロパティの割り当ては、A の viewDidLoad が完了した後にのみ行う必要があります。

例えば、

[b.navController pushViewController:a animated:YES];
a.status = @"loaded";

ここでは、最初にステータスが割り当てられ、次にviewDidLoadA が実行されました。これは iOS 7 でのみ発生しますが、iOS6 では問題なく動作します。

誰でも問題がどこにあるのか教えてもらえますか?

更新: iOS7 で場合によっては、プッシュ ビューが機能しないことがあります。どうすればデバッグして修正できますか?

4

8 に答える 8

1

alloc init の後に viewcontroller.view (alloc の直後に何かを設定) プロパティにアクセスするだけです。

どちらがview/viewdidloadをロードします。
Apple のドキュメントを参照してください

于 2013-10-07T14:01:02.423 に答える
1

私の経験では、UIViewController作業している iOS のバージョンに関係なく、ビューは遅延して読み込まれます。ビューの読み込みをトリガーしたい場合はUIViewController viewDidLoad、UIViewController が割り当てられた後にビューにアクセスする必要があります。例えば:

UIViewController *aViewController = [[CustomViewController alloc] init];
[aViewController view];

次のようにコーディングしないでください。

aViewController.view

それはコンパイラの警告を生成するためです。

したがって、あなたの場合、次のようにする必要があります。

...
CustomViewController *a = [[CustomViewController alloc] init];
[b.navController pushViewController:a animated:YES];
[a view];
a.status = @"loaded";

さらに問題がある場合はお知らせください。

于 2013-12-10T23:24:03.183 に答える
0

ビューが読み込まれたら、デリゲート メソッドを呼び出すことをお勧めします。デリゲートをコントローラー B に設定し、viewDidLoad が終了したら (コントローラー A で) デリゲート メソッドを呼び出します。必要に応じてデリゲートにパラメーターを渡すこともできます。

コード例を次に示します。

コントローラ B:

a.delegate = self;
[b.navigationController pushViewController:a animated:YES];

デリゲート メソッドを実装します。

- (void)controllerIsLoaded:(ControllerA *)controllerA status:(NSString *)status
{
    a.status = status;
}

コントローラ A .h ファイル:

@class ControllerA;

@protocol ControllerADelegate <NSObject>
- (void)controllerIsLoaded:(ControllerA *)controllerA status:(NSString *)status;
@end

@interface ControllerA : UIViewController 

@property (nonatomic, weak) id <ControllerADelegate> delegate;

コントローラ A .m ファイル:

- (void)viewDidLoad:(BOOL)animated
{
    [super viewDidLoad:animated];

    /* your viewDidLoad code here... */

    if ([_delegate respondsToSelector:@selector(controllerIsLoaded:status)])
        [_delegate controllerIsLoaded:self status:@"Loaded"];
}
于 2013-12-10T21:10:18.147 に答える
0

UINavigationControllerDelegateを実装し、自分自身をデリゲートとして設定することで、View Controller がスタックにプッシュされたときを知ることができself.navigationController.delegate = self;ます。その後、プッシュのたびにこのコールバックを取得します。

navigationController:didShowViewController:animated:

したがって、表示されたviewControllerが興味のあるものであるかどうかを確認してから、a.statusを設定できます。

于 2013-12-04T22:34:57.257 に答える
0

viewWillAppear次のクラスではなくメソッドにコードを記述してくださいviewDidLoad。つまり、オブジェクトをプッシュする場所です。

-(void)viewWillAppear:(BOOL)animated
{

}
于 2013-12-09T05:03:41.533 に答える