NSView 不显示更新

Posted

技术标签:

【中文标题】NSView 不显示更新【英文标题】:NSView doesn't show update 【发布时间】:2014-05-26 10:08:38 【问题描述】:

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

我发现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

... 所以它应该真的有效——我不知道为什么它不重绘。 有人有想法吗?

【问题讨论】:

请编辑your existing question而不是转发。 【参考方案1】:

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

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

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

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

【讨论】:

谢谢你的回答——你说得对,我可以把它放在视图中,我也可以使用我改变的文本字段——但我的问题是,我必须将数据传递给 NSView它不起作用 - 这是主要问题。如果我没有在 awakeFromNib 上分配视图,我不会将任何数据传递给视图。

以上是关于NSView 不显示更新的主要内容,如果未能解决你的问题,请参考以下文章

添加为子视图的 NSView 不显示

如何在 NSView (Mac OS X) 上显示徽章

在几个 NSView 之间交替

如何在不重绘整个视图的情况下更新 NSView 的一部分

在其他视图上显示 NSView 子类

添加子视图到 NSView 显示,但不能删除