目标-c:在按钮单击时将视图添加到窗口
Posted
技术标签:
【中文标题】目标-c:在按钮单击时将视图添加到窗口【英文标题】:objective-c: add view to window on button click 【发布时间】:2010-12-11 13:11:07 【问题描述】:我是 Objective-c 的新手,所以请耐心等待。这看起来很简单,但我一定做错了什么。在 IB 中,我创建了一个对象,将其命名为 AppController,然后添加了一个名为 makeView 的操作和两个 IBOutlets,btnMakeView 和 mainWin,然后正确连接所有内容并从中编写类文件。
在 AppController.h 我有这个代码:
#import <Cocoa/Cocoa.h>
@interface AppController : NSObject
IBOutlet NSWindow * mainWin;
IBOutlet id btnMakeView;
- (IBAction)makeView:(id)sender;
@end
在 AppController.m 中这段代码:
#import "AppController.h"
#import "ViewController.h"
@implementation AppController
- (IBAction)makeView:(id)sender
//declare a new instance of viewcontroller, which inherits fromNSView, were going to allocate it with
//a frame and set the bounds of that frame using NSMakeRect and the floats we plug in.
ViewController* testbox = [[ViewController alloc]initWithFrame:NSMakeRect(10.0, 10.0, 100.0, 20.0)];
//this tells the window to add our subview testbox to it's contentview
[[mainWin contentView]addSubview:testbox];
-(BOOL)isFlipped
return YES;
@end
在 ViewController.h 我有这个代码:
#import <Cocoa/Cocoa.h>
@interface ViewController : NSView
@end
最后在 ViewController.m 我有这个代码:
#import "ViewController.h"
@implementation ViewController
- (id)initWithFrame:(NSRect)frame
self = [super initWithFrame:frame];
if (self)
// Initialization code here.
return self;
- (void)drawRect:(NSRect)rect
// Drawing code here.
//sets the background color of the view object
[[NSColor redColor]set];
//fills the bounds of the view object with the background color
NSRectFill([self bounds]);
@end
它编译得很好,没有错误但没有得到一个对象,我假设它是一个矩形,从 x,y 10/10 开始,为 100x20。我做错了什么?
【问题讨论】:
只是补充一点,我已经记录了 ViewController 的 initWithFrame 方法,以确保我到达那里并且我到达了。 请注意,您可以通过缩进四个空格将行格式化为代码。编辑器工具栏中的“101\n010”按钮为您完成此操作。单击编辑器工具栏中的橙色问号以获取有关格式设置的更多信息和提示。您现在可以编辑帖子并修正格式。 outis,谢谢,每次我使用 101\n010 按钮输入代码时,它的格式都会很糟糕,正如你所知道的那样。不知道为什么。不知道缩进,但以后会使用它,以及接受答案功能,也不知道。 代码按钮的行为会有所不同,具体取决于是否有任何选定的文本,以及所有行是否缩进至少 4 个空格。它充当切换开关,在代码(通过缩进)和非代码(通过取消缩进)之间切换。制表符有问题。我建议用四个空格替换源代码中的所有选项卡(您可以使用搜索和替换,或谷歌了解如何配置 XCode 以使用空格)。 【参考方案1】:mainWin
指的是一个有效的窗口吗?除此之外,您的代码可以工作,尽管它可能需要一些改进。例如,
ViewController
是视图,而不是控制器,因此不应将其命名为控制器。
您遇到了内存泄漏。你永远不会释放你创建的ViewController
。 memory management rules are very simple;阅读它们。
尝试以下更改。首先,将ViewController
重命名为RedView
(或SolidColorView
或类似名称)。您可以通过 refactoring 非常简单地做到这一点:right-click @interface
或 @implementation
声明中的类名并选择“重构...”。
在 RedView.m 中:
- (id)initWithFrame:(NSRect)frame
// the idiom is to call super's init method and test self all in the
// same line. Note the extra parentheses around the expression. This is a
// hint that we really want the assignment and not an equality comparison.
if ((self = [super initWithFrame:frame]))
// Initialization code here.
return self;
在 AppController.m 中:
- (IBAction)makeView:(id)sender
//declare a new instance of viewcontroller, which inherits fromNSView, were going to allocate it with
//a frame and set the bounds of that frame using NSMakeRect and the floats we plug in.
RedView* testbox = [[RedView alloc] initWithFrame:NSMakeRect(10.0, 10.0, 100.0, 20.0)];
//this tells the window to add our subview testbox to it's contentview
// You don't need to keep a reference to the main window. The application already
// does this. You might forget to hook up mainWin, but the following won't fail
// as long as the app has a main window.
[[[[NSApplication sharedApplication] mainWindow] contentView] addSubview:testbox];
// We're done with testbox, so release it.
[testbox release];
【讨论】:
是的,mainWin 是一个有效的窗口。感谢您的帮助和代码改进。 @PruitIgoe:当您尝试上述makeView
时,它是否有效?如果没有,您需要尝试调试器来查看未定义的内容或未执行的内容。
我要去把自己放在愚蠢的角落里......我给窗口(在 IB 中)命名为 mainWin,在 AppController.h 文件中我有 IBOutlet NSWindow* mainWin ...我从 IB 中取名,一切正常...感谢所有帮助。以上是关于目标-c:在按钮单击时将视图添加到窗口的主要内容,如果未能解决你的问题,请参考以下文章