【发布时间】:2016-09-01 23:43:43
【问题描述】:
我正在阅读这本名为“mac os x 的可可编程”的书,我刚从委托开始。与代表的这件事对我来说仍然有点古怪,但我认为我只需要让它解决。
但是有一个练习,我应该实现一个主窗口的委托,这样如果调整大小的高度总是 2xwidth。
所以我得到了 4 个文件:
- AppDelegate.h
- AppDelegate.m
- WindowDelegate.h
- WindowDelegate.m
AppDelegate 只是您打开一个新的 Cocoa 项目时创建的两个标准文件。我不得不查找解决方案,因为我不太清楚如何完成这项任务。 解决方案就是创建一个新的 cocoa 类“WindowDelegat.h/.m”并将其添加到它的实现文件中:
- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize {
NSSize newSize = frameSize;
newSize.height = newSize.width * 2;
return newSize;
}
然后我打开界面生成器,添加了一个新对象并将其设为我的 WindowDelegate。然后我不得不从 WindowDelegate Ctrl 拖动到实际的窗口,并使其成为窗口的委托。 单击运行,它工作。耶!但为什么? 首先,我认为“windowWillResize”只是这些回调函数之一,一旦调整窗口大小就会被调用,但事实并非如此。通常方法被调用是因为程序的一般生命周期调用它们或者因为它们是@IBAction、按钮或不同的控制元素。 但是“windowWillResize”不是其中之一。那为什么叫它呢?
编辑:问题解决了!非常感谢!
现在我正在尝试以编程方式将代理连接到窗口。因此,我将 WindowDelegate 中的引用出口删除到界面生成器中的实际窗口。它有效,但我只是想验证它是否以正确的方式完成:
AppDelegate.h
#import <Cocoa/Cocoa.h>
#import "WindowDelegate.h"
@interface AppDelegate : NSObject <NSApplicationDelegate>
@end
AppDelegate.m
#import "AppDelegate.h"
@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
@property (strong) WindowDelegate *winDeleg;
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
// Insert code here to tear down your application
}
- (void)awakeFromNib {
[_window setOpaque:NO];
NSColor *transparentColor = [NSColor colorWithDeviceRed:0.0 green:0.0 blue:0.0 alpha:0.5];
[_window setBackgroundColor:transparentColor];
NSSize initialSize = NSMakeSize(100, 200);
[_window setContentSize:initialSize];
_winDeleg = [[WindowDelegate alloc] init];
[_window setDelegate: _winDeleg];
}
@end
WindowDelegate.h
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
@interface WindowDelegate : NSObject <NSWindowDelegate>
@end
WindowDelegate.m
#import "WindowDelegate.h"
@implementation WindowDelegate
- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize {
NSSize newSize = frameSize;
newSize.height = newSize.width * 2;
return newSize;
}
- (id)init {
self = [super init];
return self;
}
@end
为什么WindowDelegate 的@property 需要强? 我的 winDeleg 不是一个对象吗?当它是一个对象时,为什么我必须通过 _winDeleg 访问它。我虽然下划线是用来访问变量的?
感谢您的帮助!
【问题讨论】:
标签: objective-c macos cocoa delegates