gpt4 book ai didi

objective-c - 在 Cocoa 中的不同类中设置变量

转载 作者:行者123 更新时间:2023-12-03 17:58:13 25 4
gpt4 key购买 nike

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

这是我想要做的事情以及我的项目中的代码的图表: enter image description here

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 似乎不起作用。有什么建议吗?

最佳答案

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

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

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

您需要确定/更改两件事。首先,需要有一个 ClassX 的实例在你的xib中。二、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: ,您只需使用该 socket ,而不是创建 ClassA 的新实例:[[self theClassAInstance] setStringA:@"stringX for stringA"];

<小时/>

风格三点:

首先,您应该导入 Cocoa.h:#import <Cocoa/Cocoa.h>而不是任何涉及 GUI 的类中的 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

最后(四点!),您确实应该访问 stringA 的值和stringBClassA通过属性:[textA setStringValue:[self stringA]];

关于objective-c - 在 Cocoa 中的不同类中设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10356822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com