【问题标题】:Labels won't label标签不会标注
【发布时间】:2024-01-03 07:46:02
【问题描述】:

我要疯了!我只是不明白。 当我启动第二个窗口时,会在第二个窗口控制器中调用一个方法。该方法进行了大量计算,并应通过插座将一些结果放入标签中。标签保持为空。我不知道如何让它工作。

我的 AppDelegate.m:

#import "AppDelegate.h"
#import "ToDoItem.h"
#import "ResultWindowController.h"

@implementation AppDelegate

- (IBAction)pushRun:(id)sender {

    if (rwc)
    {
        [rwc close];
    }
    rwc = [[ResultWindowController alloc] init];
    [rwc calculateResults];//add observer
    [rwc setShouldCascadeWindows:NO]; //window re-opens at the same position
    [rwc showWindow:self];
}
@end

我的 ResultWindowController.h:

#import <Cocoa/Cocoa.h>

@interface ResultWindowController : NSWindowController
{

}
@property (weak) IBOutlet NSTextField *outputResultAverageValue;
@property (weak) IBOutlet NSTextField *outputResultToleranceValue;

-(void)calculateResults;

@end

ResultWindowController.m:

-(void)awakeFromNib
{
    NSString *initial =@"-";
    [_outputResultAverageValue setStringValue:initial];
    [_outputResultToleranceValue setStringValue:initial];
}

- (void)calculateResults
{
double resultAverageValue = 0, resultToleranceValue = 0;

 //calculations
 for-loop{

   resultAverageValue = (maxresult + minresult)/2;
   resultToleranceValue = (maxresult - minresult)/2;
 }

NSLog(@"resultaverage is:%f", resultAverageValue);
[_outputResultAverageValue setDoubleValue:resultAverageValue];
[_outputResultToleranceValue setDoubleValue:resultToleranceValue];
}

NSLog 给了我想要在标签中显示的值。我还可以使用awakeFromNib 方法初始化我的标签。 我有设计失败吗?我是否需要确保在 calculateResults 方法完成后设置标签?

提前致谢!!!

【问题讨论】:

  • _outputResultAverageValue的数据类型是什么?您尝试设置标签文本的代码在哪里?
  • 嗨 rmaddy,我添加了上面的代码。它是否需要始终是文本? _outputResultAverageValue 是一个连接到笔尖标签的 NSTextfield 出口。

标签: objective-c label outlet


【解决方案1】:
  1. 您能具体说明一下为什么要使用weak吗?

  2. 尝试使用:

    [self._outputResultAverageValue setDoubleValue:resultAverageValue];
    [self._outputResultToleranceValue setDoubleValue:resultToleranceValue];
    

    另外,你连接插座了吗?

  3. ViewControllers 的想法是从模型请求计算或逻辑,然后将其提交给视图。所以,我不会真正将其称为设计流程,但最好遵循 iOS 中的模型视图控制器的想法。

【讨论】:

  • 我使用了weak for Outlets,它通常可以正常工作。我确实按照您的建议尝试使用self.,但它仍然不起作用。插座连接在 IB 中。
  • 想看看您是如何初始化标签的。
  • @omniDETH 你不能打电话给[self._outputResultAverageValue setDoubleValue:resultAverageValue];。没有名为 _outputResultAverageValue 的属性。您可以使用self.outputResultAverageValue,也可以使用self-&gt;_outputResultAverageValue,这与_outputResultAverageValue 相同。
  • 对。我已经将代码改编为[self.outputResultToleranceValue setDoubleValue: resultToleranceValue]; 但为什么它仍然不起作用。我想知道时间是否有冲突。我是否需要添加一些内容以确保在 calculateResult 方法完成后发送数据?
  • 您能否检查一下您的 -awakeFromNib 是否启动?我怀疑它会。但只需在 -awakeFromNib 方法的第一个语句中添加一个断点,让我知道这是否有效。
【解决方案2】:

我希望这会奏效,但是这样做:

.h

@property (nonatomic, strong) IBOutlet UILabel *averageValueLabel;

.m

-(void)calculateResults {
     //your stuff

     averageValueLabel.text = [NSString stringWithFormat:@"%g", resultAverageLabel];
}

【讨论】:

  • 你好 nlee918。我正在开发一个不是 iOS 的 osx 应用程序,但我确实尝试了你的建议:_outputResultAverageValue.stringValue = [NSString stringWithFormat: @"%g",resultAverageValue];。我在 osx 版本中找不到NSLabel,但使用了NSString。不幸的是,它仍然不起作用。但它正在编译没有错误。所以,这仍然是一种有趣的方法。
  • @JFS 哦,对不起,我不知道你在使用 OSX 编程。不幸的是,即使他们使用相同的语言,我也不熟悉 OSX 编程。
  • 绝对没问题。改编后的代码没有错误,仍然很有趣。谢谢!
  • @nlee918 所有 Foundation 的东西在 iOS 和 OSX 中几乎相同,例如诸如 NSString、NSNumber、NSDictionary、NSData 等之类的东西。大多数 iOS 代码将在 OSX 上编译,反之亦然,有一个很大的例外:UI。 UI 框架完全不同。 iOS 使用 UIKit,OS X 使用 AppKit(注意:有人说 Cocoa,但这是错误的,Cocoa 是一个由 Foundation 和 AppKit 组成的元框架)。所以基本上每个名称以 UI 开头的类在 OS X 上都不存在(尽管许多类具有非常相似的等价物:例如 UIButton NSButton)
  • @Mecki 哦,这有什么区别?感谢您发布此 +1
【解决方案3】:

我终于找到了我的问题。我用 xib 中的ResultWindowController 对象绑定了网点。我将绑定更改为File's Owner,现在可以使用了。

【讨论】: