【问题标题】:addSubview not showing up in NSView Objective C CocoaaddSubview 没有出现在 NSView Objective C Cocoa 中
【发布时间】:2013-01-02 00:27:58
【问题描述】:

当我addSubview: 时,什么都没有出现。我设置了文本和颜色来查看它。此外,如果我手动将视图添加到 xcode 中 UI bulder 中的自定义视图,它的文本和颜色显示得很好。

.m 文件

- (void)displayString:(NSString *)title {
    NSRect frame = NSMakeRect(10, 10, 200, 17);
    NSTextfield *newfield = [[NSTextField alloc] initWithFrame:frame];
    [newfield setBezeled:NO];
    [newfield setDrawsBackground:NO];
    [newfield setEditable:NO];
    [newfield setSelectable:NO];
    [newfield setStringValue:title];
    [newfield setTextColor:[NSColor blueColor]];
    [test addSubview:newfield];

    if([test.subviews containsObject:newfield]){
        NSLog(@"view there"); // i get this message 
    }
    if([newfield isHidden]){
        NSLog(@"view hidden"); //i dont get this message
    }
    NSLog(@"view set");

}

test 是我已正确链接的NSView(自定义视图是 xcode 所称的)。

因此,当我创建文本字段并将其手动添加到 NSView,然后通过添加文本和颜色运行相同的代码时,一切正常,当我尝试以编程方式设置视图时,就会出现此问题。此外,我确保这不是我创建的视图,因为我尝试在构建器中创建视图,而不是将其放置在 NSView 中,然后尝试 addSubview:,但这也不起作用。如果您需要更多代码,请告诉我。

开发: 如果nsview(自定义视图)中已经有一个元素(手动添加并且可以是任何东西)并且我添加了它可以工作的文本字段(我在nsview中获得了两个视图)?子视图已经过测试,只是看不到它。

【问题讨论】:

  • 我认为您的 NSTextField 没有尺寸,这就是它没有出现的原因。尝试设置框架或边界,或者调用 initWithFrame:bundle: 而不是常规的 init,看看会给出什么。
  • 好的,所以我试了一下,没有改变。我认为这不会导致更改,因为当我在 xcode 构建器中创建文本字段然后尝试添加它时,我遇到了同样的问题。唯一可行的方法是NSView 和文本字段都是预先制作和预先定位的。
  • 你试过把子视图放在前面吗? (self.view bringSubviewToFront:newfield])
  • 当我做[test bringSubviewToFront:newfield];时,我没有看到'nsview'的可见@interface 声明选择器'bringsubviewtofront:'
  • 详细说明您的最新编辑。你看不见吗?这是否意味着它被隐藏了(你可以通过isHidden 测试),还是它超出了超级视图的框架?

标签: objective-c cocoa


【解决方案1】:

您必须致电 initWithFrame: 而不仅仅是 init

- (void)displayString:(NSString *)title {
    NSRect frame = NSMakeRect(10, 10, 200, 200);
    NSTextField *newfield = [[NSTextField alloc] initWithFrame:frame];
    [newfield setStringValue:title];
    [newfield setTextColor:[NSColor blueColor]];
    [test addSubview:newfield];
    NSLog(@"view set");
}

【讨论】:

  • 那不是问题,我试过了,还是这样。我在问题底部的问题中添加了新提示。
【解决方案2】:

什么类型的视图是测试?你还需要做一个:

 newfield.frame = CGRectMake(x,y,width,height) 

为了指定视图的外观

【讨论】:

  • 有趣的开发,如果nsview(自定义视图)中已经有一个元素(手动添加)并且我添加了它可以工作的文本字段?
  • 您可以使用 if([test.subviews containsObject:newfield]) 仔细检查它是否实际被添加
  • 这样如果语句没有触发......是什么阻止它被添加,似乎在准备自定义视图以接受子视图时缺少一个步骤。
  • 大错特错,在急于向所有人讲话时,我将 if 语句放在了 addSubview 之前,但是一旦我把它放在正确的位置,它就在那里,只是不可见。
  • 您是否在将框架添加到视图之前指定了框架?
【解决方案3】:

原来我设置的视图太早了。我的印象是,在视图设置后对视图所做的任何操作都会反映在视图上,但这似乎是问题所在。在将视图更改为我想要的方式后,然后设置NSStatuditem 的视图。 所以我得到了

  [newfield setStringValue:title];
  [newfield setTextColor:[NSColor blueColor]];
  [test addSubview:newfield];
  [statusItem setView:test];//this is the key, setting it after he changes. 

【讨论】:

    猜你喜欢
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2011-01-05
    • 2011-01-18
    • 1970-01-01
    • 2017-09-28
    相关资源
    最近更新 更多