无法访问班级

时间:2015-12-22 16:01:17

标签: ios objective-c

//MigrationVC.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface MigrationVC : UIViewController

@end

//MigrationVC.m
#import "MigrationVC.h"

@interface MigrationVC()
@property (strong, nonatomic) IBOutlet UILabel *label;
@property (strong, nonatomic) IBOutlet UIProgressView *progressView;

@end

@implementation MigrationVC

@end

//CoreData
#import "CoreData.h"
#import "MigrationVC.h"

@interface CoreData()
@property (nonatomic,retain) MigrationVC *migrationVC;
@end

-(void)obsererForKeyPath:(NSString*)keyPath object:(id)object change:(NSDictionary*)change context:(void*)context
{
    if([keyPath isEqualToString:@"migrationProgress"])
    {
        dispatch_async(dispatch_get_main_queue(),^{
            float progress=[[change objectForKey:NSKeyValueChangeNewKey] floatValue];
            self.migrationVC.progress=progress;
        });
    }
}

我正在尝试学习CoreData和迁移,但这让我很头疼。

我正在尝试从其他类访问outlet属性但总是给出红色警告(在MigrationVC *类型的对象上找不到属性'标签'。

我尝试在.h文件中添加一个可访问的NSString属性但是当我尝试将插件从.m更改为.h文件时,我无法按住Ctrl键并拖动.h文件中的视图。

我从未遇到过这个问题。我过去曾多次从.m文件访问过,但它现在只是给我警告。 如何在.m文件中插入时访问属性?

The problem is i can't add the outlet in .h file

我无法在.h文件中输出属性。

4 个答案:

答案 0 :(得分:3)

您必须将插座属性从.m文件转移到.h文件(复制和粘贴)。如果您希望您的属性是公共的,那么必须在头文件中声明它们。如果您希望它们是私有的 - 在实现文件中声明它们。

//MigrationVC.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface MigrationVC : UIViewController
@property (strong, nonatomic) IBOutlet UILabel *label;
@property (strong, nonatomic) IBOutlet UIProgressView *progressView;
@end

//MigrationVC.m
#import "MigrationVC.h"

@interface MigrationVC()

@end

@implementation MigrationVC

@end

答案 1 :(得分:3)

正如其他人所指出的那样,如果您希望可以从其他类访问它们,则需要在头文件中声明属性。你可以,你应该。如果您认为自己无法做到这一点,请解释原因。

但是,更重要的是,你不应该做你想做的事情。您不应尝试从视图控制器外部访问视图控制器的视图对象。这违反了封装原则,这是面向对象设计的一个重要原则。 (这意味着视图控制器之外的代码取决于视图控制器的外观。如果您以后决定对视图控制器进行内部更改,则很可能会破坏外部代码。)除了有点抽象的& #34;设计糟糕&#34;不这样做的原因,往往不起作用,因为在尝试修改视图控制器的视图时,它们还不存在。

相反,您应该在视图控制器中创建 DATA 属性(如字符串或浮点进度值)并公开它们。然后让您的视图控制器的viewWillAppear方法根据需要将数据安装到其视图中。这样,数据属性就成为视图控制器公共合同的一部分,而不依赖于视图控制器的内部细节。

答案 2 :(得分:1)

您的属性在私有类别中声明,因此对于其他类不可见。只有头文件中声明的属性才可见。

答案 3 :(得分:1)

在CoreData.m中,您的MigrationVC设置为retain。我不知道你是否可以在ARC使用它。

@property (nonatomic,retain) MigrationVC *migrationVC;

应该是

@property (nonatomic,strong) MigrationVC *migrationVC;

MigrationVC outlets weak strong CoreData.m而非/%postname%/和.h可以从 Year Value ----------------- 2013 -0.0016 2014 -0.0001 2015 0.0025 2016 -0.0003 2017 0.0023 2018 0.0002

访问