如何在 [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.dismiss 块中推送 UIViewController?