如何在 [self dismissModalViewControllerAnimated:YES] 之后调用 viewDidLoad;

Posted

技术标签:

【中文标题】如何在 [self dismissModalViewControllerAnimated:YES] 之后调用 viewDidLoad;【英文标题】:How to call viewDidLoad after [self dismissModalViewControllerAnimated:YES]; 【发布时间】:2012-08-30 15:41:59 【问题描述】:

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

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

谢谢。感谢您的帮助:)。

【问题讨论】:

请接受下面给出的答案。这是这个问题的正确答案。 我总是接受最正确的答案。我本来会早点接受的,但它迫使我等了 10 分钟。 【参考方案1】:

那是因为 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

示例是在 CodeRunner 中针对 OS X 运行的,我与其零隶属关系。

【讨论】:

谢谢!这正是我需要的:)。有没有办法识别它来自哪个viewController?另外,viewDidAppear 方法会在启动时执行吗?如果是这样,我基本上可以清空 viewDidLoad 方法并将其内容放在 viewDidAppear 方法中吗?垃圾收集器是否有可能删除视图控制器?这意味着它实际上必须执行 viewDidLoad 方法。如果发生这种情况,viewDidAppear 方法还会执行吗?很抱歉向您发送这些垃圾邮件:P。我只是想学习:) @GregCawthorne:好吧,如果您在推送时将self 添加为 ModalView 的委托,那么您将获得一个指向推送视图控制器的指针。这取决于您在viewDidLoad 中所做的事情。你不想将只发生一次的事情移到viewDidAppear,因为它可以被调用1次以上。成员初始化之类的东西应该留在viewDidLoad。而且,如果你使用了很多 Apple 示例代码现在都在使用的委托,你可以将其全部保留在 viewDidLoad 中,并在已实现的协议方法中更新相应的部分。 @GregCawthorne:首先,当你初始化一个类时,它的所有指针都设置为nil(类似于0x00000000)。如果 self.delegate 为 nil,if( self.delegate ) 将返回 false。因此,我们确保有一个代表。其次,您可以向nil 或对象发送任何消息,并且直到运行时才会检查。因此,添加该检查可以规避一些常见的崩溃情况 - nil 指针和没有目标接收器。 @GregCawthorne:如果您决定使用 Segues,Obj-C 运行时会在加载下一个 ViewController 之前自动调用该方法。我只把它放在 .h 中,这样当我们在 main() 中调用它时,它不会抛出我上面提到的“v 可能不响应选择器”的错误。与任何类似 C 的语言一样,为了最安全,您需要在界面中公开您的公共方法签名。 @GregCawthorne:听起来你对一些基本的 Objective-C 的东西还不太了解,所以我强烈建议你在弄乱 ios 之前阅读this guide。

以上是关于如何在 [self dismissModalViewControllerAnimated:YES] 之后调用 viewDidLoad;的主要内容,如果未能解决你的问题,请参考以下文章

如何在闭包中使用 self 来防止内存泄漏

如何在 Python 的抽象类实现中使用 self?

如何在 self.dismiss 块中推送 UIViewController?

如何动态读取 QLineEdit 数据

如何在“loadView”之外创建的按钮方法中更改“self.view”

如何使用 Ruby 的 self 关键字