- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我看过很多关于堆栈溢出的帖子,指出 Controller 的 viewDidLoad 方法仅在第一次访问 Controller 时调用,不一定每次都调用,但总是至少调用一次。
这根本不是我看到的!我整理了一个简单的测试来强调这一点:
https://github.com/imuz/ViewDidLoadTest
似乎导航 Controller segues 和模态视图 viewDidLoad 总是被调用。唯一不调用它的是在选项卡之间切换时。
我能找到的对 viewDidLoad 的每一个解释都与此相矛盾:
最佳答案
菲利普米尔斯的回答是正确的。这只是对它的增强。
系统按记录工作。
您看到 viewDidLoad 因为被推送到导航 Controller 的 View Controller 是 新 实例。它必须调用 viewDidLoad。
如果您进一步调查,您会看到这些 View Controller 中的每一个在弹出时都被释放(只需在 dealloc 中放置一个断点或 NSLog)。这个释放与 View Controller 容器无关......它不控制它使用的 Controller 的生命......它只是持有对它的强引用。
当 Controller 从导航 Controller 堆栈中弹出时,导航 Controller 释放它的引用,并且由于没有其他对它的引用, View Controller 将释放。
导航 Controller 仅持有对其事件堆栈中的 View Controller 的强引用。
如果你想复用同一个 Controller ,你 负责重用它。当您使用 Storyboard转场时,您(在很大程度上)放弃了该控制。
假设您有一个 push
继续查看 Controller Foo
作为点击某个按钮的结果。当点击该按钮时,“系统”将创建 Foo
的实例。 (目标 View Controller ),然后执行 segue。 Controller 容器现在拥有对该 View Controller 的唯一强引用。完成后,VC 将解除分配。
由于它每次都会创建一个新的 Controller ,viewDidLoad
每次出现该 Controller 时都会调用。
现在,如果你想改变这种行为,并缓存 View Controller 以供以后重用,你必须专门这样做。如果您不使用 Storyboard转场,这很容易,因为您实际上是将 VC 推送/弹出到导航 Controller 。
但是,如果您使用 Storyboard转场,那就有点麻烦了。
有很多方法可以做到这一点,但都需要某种形式的黑客攻击。 Storyboard本身负责实例化新的 View Controller 。一种方法是覆盖 instantiateViewControllerWithIdentifier
.这是当 segue 需要创建 View Controller 时调用的方法。甚至对于您没有为其分配标识符的 Controller 也会调用它(如果您不分配一个,系统会提供一个虚构的唯一标识符)。
请注意,我希望这主要用于教育目的。我当然不是建议这是解决您的问题的最佳方法,无论它们是什么。
就像是...
@interface MyStoryboard : UIStoryboard
@property BOOL shouldUseCache;
- (void)evict:(NSString*)identifier;
- (void)purge;
@end
@implementation MyStoryboard
- (NSMutableDictionary*)cache {
static char const kCacheKey[1];
NSMutableDictionary *cache = objc_getAssociatedObject(self, kCacheKey);
if (nil == cache) {
cache = [NSMutableDictionary dictionary];
objc_setAssociatedObject(self, kCacheKey, cache, OBJC_ASSOCIATION_RETAIN);
}
return cache;
}
- (void)evict:(NSString *)identifier {
[[self cache] removeObjectForKey:identifier];
}
- (void)purge {
[[self cache] removeAllObjects];
}
- (id)instantiateViewControllerWithIdentifier:(NSString *)identifier {
if (!self.shouldUseCache) {
return [super instantiateViewControllerWithIdentifier:identifier];
}
NSMutableDictionary *cache = [self cache];
id result = [cache objectForKey:identifier];
if (result) return result;
result = [super instantiateViewControllerWithIdentifier:identifier];
[cache setObject:result forKey:identifier];
return result;
}
@end
storyboard
获取创建它的 Storyboard。
关于iphone - viewDidLoad 实际上是在每次有 segue 转换时调用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11969452/
我正在学习 objective-c 教程,并注意到 viewDidLoad 中的代码放在 super viewDidLoad 下,而不是第一次调用 viewDidLoad。 代码放在viewDidLo
在Apple的scrollView示例中,他们没有这样称呼。我一直认为这是必须的。我为什么要这样调用它? 最佳答案 如果您要重写该方法,您仍然应该在 super 中调用该方法。即使父类(super c
这个问题已经有答案了: Why/when do we have to call super.ViewDidLoad? (6 个回答) 已关闭 4 年前。 override func viewDidLo
大家好,我有一个双 View Controller 。 我的 firstviewcontroller 有一个按钮,这个按钮发送 NSNotification,secontviewController
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Do I always have to call [super viewDidLoad] in the -v
我有一个关于子类化的问题。 我从我的第一个 View 开始:在我的 .h 文件中: @interface viewAController : UIViewController 在我的 .m 文件中:
我读到一篇文章说,当创建 UIViewController 类时,属性需要为零,然后 Storyboard 或在调用 viewDidLoad 时将其添加到值中。 它表示在构造对象时也无法初始化属性。
这是我当前的代码。我什至没有通过 viewDidLoad 方法覆盖,因为在它说 super viewdidload 的那一行它抛出错误 @interface for uitableview 为选择器
import UIKit class SecondViewController: UIViewController { @IBOutlet weak var labelA: UILabel!
我需要设置和存储一些可用于 View 的 NSUserDefaults 数据。这不适用于 viewDidLoad。 这可以做到吗? 在 viewDidLoad 之前我可以使用什么方法? 你会推荐什么?
当我向主视图 Controller 中的 viewDidLoad 添加方法时,我的 iPhone 应用程序崩溃了: #import "dbQuestionGetterViewController.h"
当用户切换到另一个程序然后再次返回时,原始程序的 View 将被另一个程序的新 View 替换。那么当用户切换回原来的程序时,viewDidLoad会被第二次调用吗? 我问这个是因为如果是这种情况,那
全部, 我正在从我的 applicationDidFinishLaunching 方法创建一个 windowController ... (void)applicationDidFinishLaunc
这个问题已经有答案了: Looking to understand the iOS UIViewController lifecycle (11 个回答) iPhone SDK: what is th
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 5年前关闭。 Improve this
我知道viewDidLoad在 UIViewController 期间可能会多次调用方法的生命周期。但这怎么可能?如何让它多次调用而不是直接调用它?我试过这样做: UIView *view = [
我在使用 iOS 时遇到了一点问题。我使用协议(protocol)在两个 View Controller 之间来回传递数据并手动切换 View 。我的问题是,当我关闭顶 View 时,不再调用底 Vi
我正在开发一款新应用程序,该应用程序主要用于组织网络内容中的信息。它将是一款用于监控道琼斯指数股息 yield 的金融应用程序。为此,需要执行几个步骤,但我现在正在执行第一步。我想选取道琼斯指数中的
我需要采用 viewDidLoad 方法中填充的变量来显示在连接到自定义单元格的标签上。我想做的是: 查找数据库中存储的用户盒子中的 SKU 使用SKU查找数据库中存储的产品详细信息 将产品详细信息存
我正在 viewDidLoad 中使用异步任务函数,根据返回的响应,我正在更改 View (颜色、文本...),但我有“错误”: 有时,当我更改 View 并返回 View 时,我的 View 背景没
我是一名优秀的程序员,十分优秀!