NSView不显示更新

时间:2014-05-26 10:08:38

标签: objective-c cocoa nsview

我正在尝试以编程方式更新视图。因此我有一个控制器和一个视图。控制器应按下按钮更新视图。但是,虽然方法被调用,但视图没有明显更新。

我发现NSView有另一个对象ID,而不是控制器保留的对象ID。 (这是正确的术语吗?)

这是代码:

//  myView.h

#import <Cocoa/Cocoa.h>

@interface myView : NSView

{
    int numberToDisplay;

}



-(void)seedNumber;
-(int)numberToDisplay;

@end

--------------------------------------------------------

//  myView.m

#import "myView.h"

@implementation myView

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSLog(@"View loaded\n%@",self);
        numberToDisplay = 0;
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];
    NSLog(@"view is drawing");
    //Draw
    NSRect textRect = NSMakeRect(5, 5, 100, 100);
    NSMutableParagraphStyle* textStyle = NSMutableParagraphStyle.defaultParagraphStyle.mutableCopy;
    textStyle.alignment = NSCenterTextAlignment;

    NSDictionary* textFontAttributes = @{NSFontAttributeName: [NSFont fontWithName: @"Helvetica" size: 50], NSForegroundColorAttributeName: NSColor.blackColor, NSParagraphStyleAttributeName: textStyle};

    [[NSString stringWithFormat:@"%d",numberToDisplay] drawInRect: NSOffsetRect(textRect, 0, 1) withAttributes: textFontAttributes];
}


-(void)seedNumber;
{
    numberToDisplay++;
    NSLog(@"view:%d",numberToDisplay);
}
-(int)numberToDisplay
{
    return numberToDisplay;
}
@end
--------------------------------------------------------

//  controller.h

#import <Foundation/Foundation.h>
@class myView;

@interface controller : NSObject

{
    myView *view;
}


-(IBAction)buttonPressed:(id)sender;
@end

--------------------------------------------------------
//  controller.m

#import "controller.h"
#import "myView.h"

@implementation controller

-(void)awakeFromNib
{

    view = [[myView alloc]init];
    NSLog(@"controller loaded\n%@",view);
}

-(IBAction)buttonPressed:(id)sender
{
    [view seedNumber];
    NSLog(@"controller: %d",[view numberToDisplay]);
    [view setNeedsDisplay:YES];
}
@end
--------------------------------------------------------

这就是命令行返回的内容(按下按钮时):

2014-05-26 11:58:20.036 graphikTest[1230:303] View loaded
<myView: 0x60000012e7e0>
2014-05-26 11:58:20.049 graphikTest[1230:303] View loaded
<myView: 0x60800012f140>
2014-05-26 11:58:20.049 graphikTest[1230:303] controller loaded
<myView: 0x60800012f140>
2014-05-26 11:58:20.087 graphikTest[1230:303] view is drawing
2014-05-26 11:58:22.083 graphikTest[1230:303] view:1
2014-05-26 11:58:22.083 graphikTest[1230:303] controller: 1
2014-05-26 11:58:22.982 graphikTest[1230:303] view:2
2014-05-26 11:58:22.983 graphikTest[1230:303] controller: 2
2014-05-26 11:58:23.432 graphikTest[1230:303] view:3
2014-05-26 11:58:23.433 graphikTest[1230:303] controller: 3
2014-05-26 11:58:23.635 graphikTest[1230:303] view:4
2014-05-26 11:58:23.636 graphikTest[1230:303] controller: 4
2014-05-26 11:58:23.849 graphikTest[1230:303] view:5
2014-05-26 11:58:23.850 graphikTest[1230:303] controller: 5

... 所以它应该实际工作 - 我不知道为什么它不重绘。 有人有想法吗?

1 个答案:

答案 0 :(得分:0)

哇!你正在努力解决这个问题。

如果显示的NSView与控制器实例保留的NSView实例没有相同的地址(您称之为对象ID),那么您有两个NSView实例。正在显示的一个和由控制器实例处理的另一个未显示的视图。发生这种情况是因为当您分配控制器时,您在awakeFromNib:中分配了另一个myView实例。此实例与您的笔尖中出现的myView实例不同。如果你想这样做,那么将controler-view声明为IBOutlet并将其连接到你的nib中(然后完全删除awakeFromNib方法)。

另外:您可以完全抛弃控制器实例并将-buttonPressed:移动到myView,然后将您之前执行的nib文件中的操作连接到第一个响应者。

另外:您可以使用NSTextField的实例来显示数字,并在-buttonPressed中设置NSTextField(self)的intValue属性:这将使值自动显示为文本。您可以在界面构建器中设置字体等。