0

我有以下文件:

主故事板

这与创建新项目时创建的默认故事板相同,但添加了一些内容:视图中有一个按钮,连接到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方法的代码中手动绑定我的所有插座。这既乏味又丑陋,因为它需要遍历所有视图的子视图并比较标识符。

4

1 回答 1

0

Apple 已确认(通过错误报告)这是一个已知问题,将在 OS X 10.10.3 中修复。

于 2015-03-12T00:59:54.097 回答