【问题标题】:Cocoa: Button Control in secondary .xib (loaded from MainWindowController) fails to invoke its ActionCocoa:辅助 .xib 中的按钮控件(从 MainWindowController 加载)无法调用其操作
【发布时间】:2016-11-13 13:30:26
【问题描述】:

MacOs 10.10 下使用 Xcode 7.3 使用 Objective c 的简单测试应用程序。

AppDelegate.h
    @property MainWindowController *myMainWindowController;

AppDelegate.m
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    _myMainWindowController = [[MainWindowController alloc] initWithWindowNibName:@"MainWindowController"];

    [_myMainWindowController showWindow:self];
}

MainWindowController.xib 只是带有主视图的 MainWindow

MainWindowController.h
    @property IBOutlet NSView * mainView;  //hooked up to the View in the MainWindowController.xib

MainWindowController.m
- (void)windowDidLoad {
    [super windowDidLoad];
    MyXib* vc = [[MyXib alloc] initWithNibName:nil bundle:nil];
    [_mainView addSubview:[vc view] ];
}

MyXib 作为 NSViewController 的子类在 Xcode 中创建。它的视图中有一个 Button 对象。

MyXib.h

@interface MyXib : NSViewController
- (IBAction)buttonPushed:(id)sender;

MyXib.m

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)buttonPushed:(id)sender{
    NSLog(@"buttonPushed");
}

theButton 的动作连接到 buttonPushed。

运行应用程序时,用户界面按预期显示。但是当单击 Button 时,程序在没有调用 buttonPushed 方法的情况下崩溃。有时调试窗口会显示堆栈爬取以类似“[NSURL buttonPushed:]: unrecognized selector sent to instance..”之类的结尾。

我已经调用了 viewDidLoad、awakeFromNib 和 init。这些调用中的断点似乎显示了根据文档的逻辑行为。

【问题讨论】:

  • 没有任何东西保留在视图控制器上,它被释放了。
  • 防止它被解除分配的最简单方法是什么?
  • 在 MainWindowController.m 中添加属性MyXib* vc

标签: objective-c xcode cocoa


【解决方案1】:

感谢威勒克!这是维护参考的修复方法:

#import "MainWindowController.h"

@interface MainWindowController ()
@property IBOutlet NSView * mainView;
@property  MyXib* vc; // maintain a reference!

@end

@implementation MainWindowController

- (void)windowDidLoad {
    [super windowDidLoad];
    //create an NSViewController and use it to load the xib
    _vc = [MyXib alloc];
    _vc = [_vc initWithNibName:nil bundle:nil];
    [_mainView addSubview:[_vc view] ];
}

@end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多