我在NSView中显示了一个NSView,它起源于NSBezierPath上的一个点。我可以在没有问题的情况下显示popover,但我似乎无法设置其中两个文本字段的字符串值。popover和content视图分别是NSPopover和NSViewController的自定义子类。NSPopover子类也是NSPopover的委托,尽管我没有实现任何委托方法,所以我甚至不确定是否需要这样做。
下面是我的NSViewController子类:
#import <Cocoa/Cocoa.h>
@interface WeightPopoverViewController : NSViewController
@end
#import "WeightPopoverViewController.h"
@interface WeightPopoverViewController ()
@end
@implementation WeightPopoverViewController
- (id)init {
self = [super initWithNibName:@"WeightPopoverViewController" bundle:nil];
if (self) {
}
return self;
}
@end以及我的NSPopover子类:
#import <Cocoa/Cocoa.h>
@interface WeightPopoverController : NSPopover <NSPopoverDelegate> {
NSTextField *dateLabel;
NSTextField *weightLabel;
}
@property (strong) IBOutlet NSTextField *dateLabel;
@property (strong) IBOutlet NSTextField *weightLabel;
@end
#import "WeightPopoverController.h"
@implementation WeightPopoverController
@synthesize weightLabel;
@synthesize dateLabel;
@end这是我的NSView子类中打开弹出窗口的代码:
@interface WeightGraphViewController () {
WeightPopoverController *popover;
WeightPopoverViewController *vc;
}
...
-(void)mouseEntered:(NSEvent *)theEvent {
// initialize the popover and its view controller
vc = [[WeightPopoverViewController alloc] init];
popover = [[WeightPopoverController alloc] init];
// configure popover
[popover setContentViewController:vc];
[popover setDelegate:popover];
[popover setAnimates:NO];
// set labels
for (id key in (id)[theEvent userData]) {
[popover.weightLabel setStringValue:[(NSDictionary*)[theEvent userData] objectForKey:key]];
[popover.dateLabel setStringValue:key];
}
// set the location
(redacted, irrelevant)
// show popover
[popover showRelativeToRect:rect ofView:[self window].contentView preferredEdge:NSMaxYEdge];
}
-(void)mouseExited:(NSEvent *)theEvent {
[popover close];
popover = nil;
}在WeightPopoverViewController.xib中,我将File's Owner设置为WeightPopoverViewController,并将视图连接到自定义NSView。在这个xib中,也有一个对象设置为WeightPopoverController,dateLabel和weightLabel连接到它们的文本字段,contentViewController设置为File's Owner。
我认为我出错的地方可能与我如何为NSPopover配置类/实例变量有关,但从我所做的研究和我阅读的文档来看,我似乎无法破解我出错的地方。任何帮助都将不胜感激。
更新:
我从代码和IB中删除了NSPopover子类。我把我的插座放在我的NSViewController,并连接到IB。但是,我仍然无法设置字符串值。下面的代码将不会使用错误“在NSPopover*‘类型的对象上找不到属性'weightLabel’”进行编译。
@interface WeightGraphViewController () {
NSPopover *popover;
...
}
-(void)mouseEntered:(NSEvent *)theEvent {
vc = [[WeightPopoverViewController alloc] init];
popover = [[NSPopover alloc] init];
[popover setContentViewController:vc];
[popover.dateLabel setStringValue:@"test"];
}我的属性定义与我在NSPopover子类中的定义完全一样,但现在在我的NSViewController中。这实际上是我以前所拥有的,因为我无法从NSViewController中设置属性,所以我想我需要通过NSPopover的子类来实现它。这就是为什么我认为我对如何配置类/实例变量有问题。
发布于 2014-09-12 15:40:37
您似乎正在创建两个弹出程序,一个是在代码(popover = [[WeightPopoverController alloc] init])中创建的,一个是在接口生成器中创建的(在这个xib中,我还将一个对象设置为WeightPopoverController)。想一想你想要达到的目标。
我还建议不要对NSPopover进行子类化。我相信这是造成混乱,是不必要的。相反,将这些插座放到dateLabel和weightLabel中,放在popover的内容视图控制器中。
发布于 2016-03-22 04:58:02
我经历过一些我认为类似的事情。根本的问题是,连接您的视图(XIB)到您的控制器的“出口”直到视图显示之后才被初始化。如果控制器试图在打开popover之前对视图中的任何UI控件设置属性,则这些更改将被忽略(因为所有控件都为零)。
幸运的是,有一个简单的解决方案(as mentioned in this answer):只需在控制器上调用view getter,它将强制视图更快地初始化。
换言之:
popover = [NSPopover new];
myController = [[MyViewController alloc] initWithNibName:@"MyView" bundle:nil];
popover.contentViewController = myController;
[myController view]; // force view to initialize
...set some values on myController... // works because view is now loaded
[popover showRelativeToRect: ...];https://stackoverflow.com/questions/25809910
复制相似问题