Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSView和动态加载子视图_Objective C_Cocoa_Nsview_Subviews - Fatal编程技术网

Objective c NSView和动态加载子视图

Objective c NSView和动态加载子视图,objective-c,cocoa,nsview,subviews,Objective C,Cocoa,Nsview,Subviews,要了解我在做什么,而不发布代码页。。。我有一个NSO操作,用于在文件添加到文件夹时处理这些文件。在该操作中,每当启动新作业时,我都使用NSNotificationCenter向NSView发送通知。我的想法是,我想添加一个新的子视图,为我提供一些关于刚刚开始的作业的信息。问题是我似乎无法绘制新的子视图。这是我现在拥有的 - (void)drawRect:(NSRect)dirtyRect { NSLog(@"Draw Count %i", [jobViewArray count]);

要了解我在做什么,而不发布代码页。。。我有一个NSO操作,用于在文件添加到文件夹时处理这些文件。在该操作中,每当启动新作业时,我都使用NSNotificationCenter向NSView发送通知。我的想法是,我想添加一个新的子视图,为我提供一些关于刚刚开始的作业的信息。问题是我似乎无法绘制新的子视图。这是我现在拥有的

- (void)drawRect:(NSRect)dirtyRect
{
    NSLog(@"Draw Count %i", [jobViewArray count]);
    int i = 0;
    while (i < [jobViewArray count]) {
        [self addSubview:[jobViewArray objectAtIndex:i]];
    }    

}

当我使用我的应用程序添加作业时,我的NSView会正确接收通知,子视图会正确添加到
jobViewArray
,但当再次调用
drawRect:
时,我的
jobViewArray
为空。这是我第一次尝试这样做,所以我可能在这里做了一些完全错误的事情。。。我想这是不言而喻的,因为它不起作用,嗯

您不应该将子视图添加到drawRect:中的视图中。当您收到通知时,您应该在那里添加子视图,因为第二次收到通知时,您将添加2个子视图,然后下次添加3个子视图,如此类推


如果在通知中添加子视图,则无需处理数组。

通知中jobViewArray的日志语句是否显示了预期结果?jobViewArray是属性吗?是的,在通知方法中,log语句返回的计数为1,但随后在drawRect中返回的计数为0。jobViewArray是一个具有以下定义的属性
@property(readwrite,copy)NSMutableArray*jobViewArray在通知中将该日志语句放在顶部。它现在所在的位置将始终至少返回一个,因为如果您不创建jobViewArray,则无论如何都会创建一个。另外,iain是对的,您不应该在drawRect中添加视图。如果在创建jobViewArray后添加日志语句,则计数返回0,因为我尚未向数组添加任何项。将nsview添加到数组后的一个返回1。我试图将其添加到drawRect:中,因为我在某个地方读到,您不应该在drawRect:之外绘制视图。实际上,每次调用通知时,我都需要一个新的子视图。对于子视图的更新,我将有一个单独的通知。我继续在通知中添加了一个
[self addSubview:newJob]
。。。但它仍然没有绘制子视图。我知道子视图的代码是有效的,因为如果我手动将其放入drawRect:它会在窗口打开时立即将子视图添加到窗口中。好的,其他信息。我丢掉了我的工作。在我的通知中,我现在有
[self addSubview:newJob]
NSLog(@“在计数%I之后,[[self subview]Count])
,它告诉我有一个子视图。当我在drawRect中调用相同的log语句时:它向我推销我有0个子视图。我不明白为什么我的子视图在我的通知和drawRect之间消失:…当您调用addSubview时:它不是在绘制子视图,只是将其添加到父视图中。子视图将在需要绘制时自己调用drawRect:。您的通知是从单独的线程调用还是从其他线程调用?如果是,您可能需要使用[self-performSelectorOnMainThread:withObject:waitUntilDone:]并创建一个新方法来执行实际的addSubview:callOK,我不知道我之前有什么错误。。。但我基本上破坏了我的子类并重写了它,就像我拥有它一样,现在它可以工作了。。。我确实根据这里的评论做了一些修改,但当我重写is时,它本质上与不起作用的代码中的代码相同。算了吧!
-(void) newJobNotification: (NSNotification *) notification
{
    if (!jobViewArray)
            jobViewArray = [[NSMutableArray alloc] init];
    ++jobCount;
    NSRect rect;
    rect.size.width = 832;
    rect.size.height = 120;
    NSPoint point = { 0, ((jobCount * 120) - 120) };
    rect.origin = point;
    ProgressView *newJob = [[ProgressView alloc] initWithFrame:rect];

    [jobViewArray addObject:newJob];    
    NSLog(@"Notice Count %i", [jobViewArray count]);

    }

}