gpt4 book ai didi

objective-c - 以编程方式使用 NSTextView 创建窗口

转载 作者:行者123 更新时间:2023-12-03 16:41:33 24 4
gpt4 key购买 nike

我希望创建一个没有 nib 文件的窗口,它完全由 NSTextView 组成。

它应该充当弹出窗口,但仍然是无模式的。

到目前为止我有两个属性:

@property (strong,nonatomic) NSWindow *consoleWindow;
@property (strong,nonatomic) NSTextView* textView;

这是我的实现:

-(void)doubleAction:(NSOutlineView*)sender
{

if(self.currentLogEntry == nil)
{
return;
}

self.consoleWindow = nil;
self.textView = nil;


NSRect windowRect = NSMakeRect(10.0f, 10.0f, 500.0f, 400.0f);
self.consoleWindow = [[NSWindow alloc] initWithContentRect:windowRect
styleMask:( NSResizableWindowMask | NSClosableWindowMask | NSTitledWindowMask)
backing:NSBackingStoreBuffered defer:NO];


self.textView = [[NSTextView alloc] initWithFrame:[[self.consoleWindow contentView] frame]];
[self.textView setString:self.currentLogEntry.value];
[self.consoleWindow setContentView:self.textView];


[self.consoleWindow makeKeyAndOrderFront:nil];
[self.consoleWindow makeFirstResponder:self.textView];



NSLog(@"Double clicked");
}

事情已经连接好,所以我有一个条目列表,每当我双击一个条目时,所选条目就会加载到 self.currentLogEntry 中,然后触发此方法。它可以工作,但如果我关闭窗口并尝试打开另一个条目,我会得到Thread 1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

我认为这与窗口未正确释放有关,但我尝试了一些方法,例如每当程序进入 doubleAction 时将属性设置为 nil (如您在代码中看到的),但这并没有帮助。

非常感谢任何解决此问题的帮助。

最佳答案

解决方案是:[self.consoleWindow setReleasedWhenClosed:NO];

以下是完整代码的最终结果(仅相关部分):.h:

@property (strong,nonatomic) NSWindow *consoleWindow;
@property (strong,nonatomic) NSTextView* textView;
@property (strong,nonatomic) NSScrollView* scrollView;

.m:

-(void)doubleAction:(NSOutlineView*)sender
{

if(self.currentLogEntry == nil)
{
return;
}

self.consoleWindow = nil;
self.textView = nil;
self.scrollView = nil;


NSRect windowRect = NSMakeRect(10.0f, 10.0f, 500.0f, 400.0f);
self.consoleWindow = [[NSWindow alloc] initWithContentRect:windowRect
styleMask:( NSResizableWindowMask | NSClosableWindowMask | NSTitledWindowMask)
backing:NSBackingStoreBuffered defer:NO];
[self.consoleWindow setReleasedWhenClosed:NO];




self.scrollView = [[NSScrollView alloc] initWithFrame:[[self.consoleWindow contentView] frame]];

[self.scrollView setBorderType:NSNoBorder];
[self.scrollView setHasVerticalScroller:YES];
[self.scrollView setHasHorizontalScroller:NO];
[self.scrollView setAutoresizingMask:NSViewWidthSizable |
NSViewHeightSizable];

NSSize contentSize = [self.scrollView contentSize];


self.textView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0,
contentSize.width, contentSize.height)];
[self.textView setMinSize:NSMakeSize(0.0, contentSize.height)];
[self.textView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
[self.textView setVerticallyResizable:YES];
[self.textView setHorizontallyResizable:NO];
[self.textView setAutoresizingMask:NSViewWidthSizable];

[[self.textView textContainer]
setContainerSize:NSMakeSize(contentSize.width, FLT_MAX)];
[[self.textView textContainer] setWidthTracksTextView:YES];



[self.textView setString:self.currentLogEntry.value];


[self.scrollView setDocumentView:self.textView];
[self.consoleWindow setContentView:self.scrollView];
[self.consoleWindow makeKeyAndOrderFront:nil];
[self.consoleWindow makeFirstResponder:self.textView];



NSLog(@"Double clicked");
}

关于objective-c - 以编程方式使用 NSTextView 创建窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19135358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com