Я показываю NSPopover в NSView, исходя из точки на NSBezierPath. Я могу показать popover без проблем, но я не могу установить строковое значение двух текстовых полей в нем. Поппер и представление содержимого - это как собственный подкласс NSPopover, так и NSViewController, соответственно. Подкласс NSPopover также является делегатом 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 у меня также есть Object, установленный в WeightPopoverController
, с атрибутом dateLabel и weightLabel, подключенным к их текстовым полям, а contentViewController - File's Owner
.
Я думаю, что я ошибаюсь, вероятно, связано с тем, как я настроил свои переменные класса/экземпляра для NSPopover, но из исследования, которое я сделал, и документации, которую я прочитал, я не могу понять, Я ошибся. Любая помощь будет оценена по достоинству.
UPDATE:
Я удалил подкласс NSPopover из кода и от IB. Я поставил свои выходные в свой NSViewController и связал их в IB. Тем не менее, я все еще не могу установить строковые значения. Следующее не будет компилироваться с ошибкой «Свойство« weightLabel »не найдено на объекте типа NSPopover *».
@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. Вот почему я думал, что у меня проблема с тем, как я настроил переменные класса/экземпляра.
Спасибо за совет. Я обновил свой вопрос на основе вашего ответа. – user4034838