0

我知道这非常简单,但我正在重新自学基础知识并试图解决这个问题:-)

我有一个名为 MainVC 的 ViewController 和一个名为 ClassVC

在 ClassVC 中,我有以下代码:

@interface ClassVC : UIViewController
{
   NSString *mainLine;
}

@property (nonatomic, retain) NSString *mainLine;
@end

我在实现文件中有这个:

@synthesize mainLine = _mainLine;

-(NSString *)_mainLine
{
    _mainLine = @"This a string from a Class";
    return _mainLine;
}

现在我在想,如果我将 ClassVC #import 到 MainVC 中,我将能够像这样传输该字符串:

 This code is in the viewDidLoad

    _mainLabel.text = _secondClass.mainLine;

    NSLog(@"%@", _secondClass.mainLine);

但这不起作用-所以我不能不通过这种方式传递字符串吗???

4

2 回答 2

1

您的属性是 mainLine,因此覆盖的 getter 应该是 -(NSString *)mainLine 而不是 -(NSString *)_mainLine。

-(NSString *)mainLine
{
    _mainLine = @"This a string from a Class";
    return _mainLine;
}

这对我有用。在 ClassVC 中:

@interface ClassVC : UIViewController 

@property (nonatomic, retain) NSString *mainLine;

@end


#import "ClassVC.h"

@implementation ClassVC

-(NSString *)mainLine
{
    _mainLine = @"This a string from a Class";
    return _mainLine;
}

这在 ViewController 中:

#import <UIKit/UIKit.h>
@class ClassVC;

@interface ViewController : UIViewController

@property (strong,nonatomic) ClassVC *secondClass;
@property (weak, nonatomic) IBOutlet UILabel *mainLabel;
@end

#import "ViewController.h"
#import "ClassVC.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    ClassVC *secondClass = [[ClassVC alloc] init];
    self.mainLabel.text = secondClass.mainLine;
     NSLog(@"%@", secondClass.mainLine);
}
于 2012-09-06T00:47:32.667 回答
0

该行:

@synthesize mainLine = _mainLine;

意味着创建一个 getter 和 setter 方法,分别称为mainLinesetMainLine:,它们包装一个名为 的实例变量_mainLine。(它为您创建实例变量,因此mainLine不需要您在标题中声明的实例变量)

(=之前的名字是属性名,等号之后的名字是它包裹的ivar的名字)

您已尝试覆盖 getter,但使用了实例变量的名称。getter 不以下划线开头,因此请从返回字符串的方法中删除下划线。

因此,在您的viewDidLoad方法中,您正在调用mainLine仅返回_mainLine实例变量的方法。你的_mainLine方法永远不会被调用

如果您只是返回一个常量字符串,那么您根本不需要属性和 ivar。

(你也不应该用下划线开始方法名称或变量,因为下划线意味着按照惯例它是私有的,Apple 基本上保留了所有以下划线开头的方法名称。但是通常让 ivars 以下划线开头)

于 2012-09-06T00:52:33.860 回答