我有以下文件:
主故事板
这与创建新项目时创建的默认故事板相同,但添加了一些内容:视图中有一个按钮,连接到button
视图控制器的出口(的实例ViewController
)和doTheThing:
视图控制器上的操作。
视图控制器.m
#import "ViewController.h"
@interface ViewController ()
@property (weak) IBOutlet NSButton *button;
@property (weak) NSViewController *controller;
@end
@implementation ViewController
- (IBAction)doTheThing:(id)sender {
if (self.controller) {
NSLog(@"Removing %@", self.controller);
[self.controller.view removeFromSuperview];
[self.controller removeFromParentViewController];
} else {
self.controller = [[NSStoryboard storyboardWithName:@"Another" bundle:[NSBundle mainBundle]] instantiateInitialController];
[self addChildViewController:self.controller];
[self.view addSubview:self.controller.view];
NSLog(@"Adding %@", self.controller);
}
}
@end
另一个故事板
一个包含单个场景(视图控制器 + 视图)的简单故事板,该场景设置为初始控制器并且是AnotherViewController
. 视图中有一个标签没有连接到任何插座。
另一个视图控制器.m
#import "AnotherViewController.h"
@interface AnotherViewController ()
@property (weak) IBOutlet NSTextField *label;
@end
@implementation AnotherViewController
- (void)dealloc {
NSLog(@"Deallocing AnotherViewController %@", self);
}
@end
当我运行应用程序并单击该按钮时,它会添加视图控制器和视图 from Another.storyboard
,当我再次单击该按钮时,它们会被删除并AnotherViewController
释放实例。
但是,如果我将标签连接Another.storyboard
到 上的label
插座AnotherViewController
,则不会发生解除分配。为什么会这样,我能做些什么来解决它?
编辑:我确实有一些解决方法,但它们并不是很理想,我更愿意理解为什么推荐的方式(故事板和插座)不能正常工作。
不受欢迎的解决方法 1:做同样的事情,但从 XIB 文件加载视图控制器和视图。这可以按预期工作,但理想情况下,我可以使用故事板做同样的事情。
不受欢迎的解决方法 2:在视图控制器viewDidLoad
方法的代码中手动绑定我的所有插座。这既乏味又丑陋,因为它需要遍历所有视图的子视图并比较标识符。