【问题标题】:Setting variables in a different class in Cocoa在 Cocoa 的不同类中设置变量
【发布时间】:2012-04-27 19:37:08
【问题描述】:

我正在尝试学习如何使用一个主要数据类为不同的类设置变量。

这是我想做的事情的图表以及我的项目中的代码:

A类

#import <Foundation/Foundation.h>

@interface ClassA : NSObject {
    NSString *stringA;
    NSString *stringB;
}

@property (nonatomic, copy) NSString *stringA;
@property (nonatomic, copy) NSString *stringB;

@property (weak) IBOutlet NSTextField *textA;
@property (weak) IBOutlet NSTextField *textB;

- (IBAction)displayStrings:(id)sender;

@end

#import "ClassA.h"

@implementation ClassA

@synthesize stringA, stringB, textA, textB;

- (IBAction)displayStrings:(id)sender {
    [textA setStringValue:stringA];
    [textB setStringValue:stringB];
}

@end

X 级

#import <Foundation/Foundation.h>

@interface ClassX : NSObject {
    NSMutableString *stringX;
}

- (void)theVariables:(id)sender;

@end

#import "ClassX.h"
#import "ClassA.h"

@implementation ClassX

- (void)awakeFromNib {
    [self theVariables:self];
}

- (void)theVariables:(id)sender {
    stringX = [[NSMutableString alloc] init];

    ClassA *clssA = [[ClassA alloc] init];

    [stringX setString:@"stringX for stringA"];
    [clssA setStringA:stringX];

    [stringX setString:@"stringX for stringB"];
    [clssA setStringB:stringX];
}

@end

代码中没有显示错误,但是当我运行程序时,我收到一个关于“无效参数不满足:aString”的错误。看起来 IBOutlet 的 setStringValue 不起作用。有什么建议吗?

【问题讨论】:

  • 请在您的问题中包含错误,并说明实际结果与您的预期结果有何不同。
  • @JacquesCousteau 更新了我的问题。
  • 那个错误指向displayStrings:中的行?
  • @JacquesCousteau 那么这是否意味着我在界面构建器中的 IBOutlets 连接错误?我以与往常一样的方式连接它们。

标签: objective-c cocoa class nsstring


【解决方案1】:

我没有看到您提到的错误,但据我从您的代码中可以看出,主要问题是这一行:

ClassA *clssA = [[ClassA alloc] init];

您的 xib 中必须有一个 ClassA 的实例,该实例连接到文本字段和一个按钮。 xib 中的那个对象是一个真实的对象,如果您只是在代码中的某处创建 ClassA 的另一个实例,那么您将拥有一个完全不同的对象,它与您的 xib 中的对象没有任何联系。

您需要确保/更改两件事。首先,您的 xib 中需要有一个 ClassX 的实例。其次,ClassX 需要一个到 ClassA 实例的出口:

@class ClassA;    // Declare ClassA so you can use it below

@interface ClassX : NSObject

@property (weak) IBOutlet ClassA * theClassAInstance;

- (void)theVariables:(id)sender;

@end

然后应该在 xib 文件中连接。然后,在theVariables: 中,您只需使用该插座而不是创建ClassA 的新实例:[[self theClassAInstance] setStringA:@"stringX for stringA"];


风格三点:

首先,您应该在任何接触 GUI 的类中导入 Cocoa.h:#import &lt;Cocoa/Cocoa.h&gt; 而不是 Foundation.h(在本例中为 ClassA)。这就是定义 NSTextField 之类的东西的地方。无论如何它都可以工作,因为 Cocoa.h 是通过您的 .pch 文件导入的,但最好是明确的。

其次,创建一个可变字符串并将其值更改为两个不同的文字字符串并没有多大意义。直接使用文字即可:[clssA setStringA:@"stringX for stringA"];

第三,您不需要单独声明实例变量; @synthesize 为您创建它们,现在推荐的做法是声明它们:

@interface ClassA : NSObject

@property (nonatomic, copy) NSString *stringA;
@property (nonatomic, copy) NSString *stringB;

@property (weak) IBOutlet NSTextField *textA;
@property (weak) IBOutlet NSTextField *textB;

- (IBAction)displayStrings:(id)sender;

@end

最后(四分!),您真的应该通过属性访问ClassA 中的stringAstringB 的值:[textA setStringValue:[self stringA]];

【讨论】:

  • 哈利路亚 - 它有效!我一直在疯狂地试图弄清楚这一点。
  • 还有一点,应用启动后如何实现ClassA中的displayStrings:?我尝试使用awakeFromNib,但我再次遇到同样的错误。
  • 发现我也可以调用 ClassA 中的方法!我可以在 [[self theClassA] displayStrings:sender]; Sweet 的 ClassX 中使用以下内容,这会处理我之前的评论。
猜你喜欢
  • 1970-01-01
  • 2018-09-03
  • 2023-03-09
  • 2017-02-14
  • 2018-08-15
  • 2011-07-23
  • 1970-01-01
  • 2011-03-27
  • 2023-01-30
相关资源
最近更新 更多