1

好的。如果您有两个 viewController 并且从第一个到第二个执行模态 Segue,则使用 [self dismissModalViewControllerAnimated:YES]; 将其关闭。它似乎不记得 viewDidLoad。我有一个主页(viewController),然后是一个选项页面,我希望在您更改选项时更新主页。当我刚刚做了两个模态序列(一个向前,一个向后)时,这很有效,但这似乎是非结构化的,并且可能导致大型项目中的代码混乱。

我听说过 push segues。他们有更好的吗?

谢谢。我很感激任何帮助:)。

4

1 回答 1

10

那是因为 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中运行,我与其零隶属关系。

于 2012-08-30T15:43:00.693 回答