これは、UIViewController が既にメモリに読み込まれているためです。ただし、viewDidAppear:を使用できます。
または、プッシュするビュー コントローラーをプッシュされたビュー コントローラーのデリゲートにし、プッシュされたコントローラーが画面を終了するときに更新を通知することもできます。
後者の方法には、 の本体全体を再実行する必要がないという利点がありviewDidAppear:
ます。たとえば、テーブルの行のみを更新している場合、全体を再レンダリングする必要はありません。
編集:デリゲートを使用する簡単な例を次に示します。
#import <Foundation/Foundation.h>
// this would be in your ModalView Controller's .h
@class ModalView;
@protocol ModalViewDelegate
- (void)modalViewSaveButtonWasTapped:(ModalView *)modalView;
@end
@interface ModalView : NSObject
@property (nonatomic, retain) id delegate;
@end
// this is in your ModalView Controller's .m
@implementation ModalView
@synthesize delegate;
- (void)didTapSaveButton
{
NSLog(@"Saving data, alerting delegate, maybe");
if( self.delegate && [self.delegate respondsToSelector:@selector(modalViewSaveButtonWasTapped:)])
{
NSLog(@"Indeed alerting delegate");
[self.delegate modalViewSaveButtonWasTapped:self];
}
}
@end
// this would be your pushing View Controller's .h
@interface ViewController : NSObject <ModalViewDelegate>
- (void)prepareForSegue;
@end;
// this would be your pushing View Controller's .m
@implementation ViewController
- (void)prepareForSegue
{
ModalView *v = [[ModalView alloc] init];
// note we tell the pushed view that the pushing view is the delegate
v.delegate = self;
// push it
// this would be called by the UI
[v didTapSaveButton];
}
- (void)modalViewSaveButtonWasTapped:(ModalView *)modalView
{
NSLog(@"In the delegate method");
}
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
ViewController *v = [[ViewController alloc] init];
[v prepareForSegue];
}
}
出力:
2012-08-30 10:55:42.061 Untitled[2239:707] Saving data, alerting delegate, maybe
2012-08-30 10:55:42.064 Untitled[2239:707] Indeed alerting delegate
2012-08-30 10:55:42.064 Untitled[2239:707] In the delegate method
例は、私がまったく関係のない OS X のCodeRunnerで実行されました。