首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在NSPopover中设置内容

无法在NSPopover中设置内容
EN

Stack Overflow用户
提问于 2014-09-12 13:50:58
回答 2查看 563关注 0票数 1

我在NSView中显示了一个NSView,它起源于NSBezierPath上的一个点。我可以在没有问题的情况下显示popover,但我似乎无法设置其中两个文本字段的字符串值。popover和content视图分别是NSPopover和NSViewController的自定义子类。NSPopover子类也是NSPopover的委托,尽管我没有实现任何委托方法,所以我甚至不确定是否需要这样做。

下面是我的NSViewController子类:

代码语言:javascript
复制
#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子类:

代码语言:javascript
复制
#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子类中打开弹出窗口的代码:

代码语言:javascript
复制
@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’”进行编译。

代码语言:javascript
复制
@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的子类来实现它。这就是为什么我认为我对如何配置类/实例变量有问题。

EN

回答 2

Stack Overflow用户

发布于 2014-09-12 15:40:37

您似乎正在创建两个弹出程序,一个是在代码(popover = [[WeightPopoverController alloc] init])中创建的,一个是在接口生成器中创建的(在这个xib中,我还将一个对象设置为WeightPopoverController)。想一想你想要达到的目标。

我还建议不要对NSPopover进行子类化。我相信这是造成混乱,是不必要的。相反,将这些插座放到dateLabelweightLabel中,放在popover的内容视图控制器中。

票数 0
EN

Stack Overflow用户

发布于 2016-03-22 04:58:02

我经历过一些我认为类似的事情。根本的问题是,连接您的视图(XIB)到您的控制器的“出口”直到视图显示之后才被初始化。如果控制器试图在打开popover之前对视图中的任何UI控件设置属性,则这些更改将被忽略(因为所有控件都为零)。

幸运的是,有一个简单的解决方案(as mentioned in this answer):只需在控制器上调用view getter,它将强制视图更快地初始化。

换言之:

代码语言:javascript
复制
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: ...];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25809910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档