Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法从类访问属性 //MigrationVC.h #进口 #进口 @接口迁移VC:UIViewController @结束 //迁移VC.m #导入“MigrationVC.h” @接口迁移VC() @属性(强,非原子)IBUILabel*标签; @属性(强,非原子)IBUIProgressView*progressView; @结束 @迁移VC的实现 @结束 //核心数据 #导入“CoreData.h” #导入“MigrationVC.h” @接口CoreData() @属性(非原子,保留)MigrationVC*MigrationVC; @结束 -(void)obsererWorkeryPath:(NSString*)键路径对象:(id)对象更改:(NSDictionary*)更改上下文:(void*)上下文 { if([keyPath IsequalString:@“migrationProgress”]) { dispatch\u async(dispatch\u get\u main\u queue()^{ 浮动进度=[[ChangeObjectForkey:NSKeyValueChangeNewKey]floatValue]; self.migrationVC.progress=进度; }); } }_Ios_Objective C - Fatal编程技术网

Ios 无法从类访问属性 //MigrationVC.h #进口 #进口 @接口迁移VC:UIViewController @结束 //迁移VC.m #导入“MigrationVC.h” @接口迁移VC() @属性(强,非原子)IBUILabel*标签; @属性(强,非原子)IBUIProgressView*progressView; @结束 @迁移VC的实现 @结束 //核心数据 #导入“CoreData.h” #导入“MigrationVC.h” @接口CoreData() @属性(非原子,保留)MigrationVC*MigrationVC; @结束 -(void)obsererWorkeryPath:(NSString*)键路径对象:(id)对象更改:(NSDictionary*)更改上下文:(void*)上下文 { if([keyPath IsequalString:@“migrationProgress”]) { dispatch\u async(dispatch\u get\u main\u queue()^{ 浮动进度=[[ChangeObjectForkey:NSKeyValueChangeNewKey]floatValue]; self.migrationVC.progress=进度; }); } }

Ios 无法从类访问属性 //MigrationVC.h #进口 #进口 @接口迁移VC:UIViewController @结束 //迁移VC.m #导入“MigrationVC.h” @接口迁移VC() @属性(强,非原子)IBUILabel*标签; @属性(强,非原子)IBUIProgressView*progressView; @结束 @迁移VC的实现 @结束 //核心数据 #导入“CoreData.h” #导入“MigrationVC.h” @接口CoreData() @属性(非原子,保留)MigrationVC*MigrationVC; @结束 -(void)obsererWorkeryPath:(NSString*)键路径对象:(id)对象更改:(NSDictionary*)更改上下文:(void*)上下文 { if([keyPath IsequalString:@“migrationProgress”]) { dispatch\u async(dispatch\u get\u main\u queue()^{ 浮动进度=[[ChangeObjectForkey:NSKeyValueChangeNewKey]floatValue]; self.migrationVC.progress=进度; }); } },ios,objective-c,Ios,Objective C,我现在正试图学习CoreData和迁移,但这让我很头疼 我试图从其他类访问outlet属性,但总是发出红色警告(在MigrationVC*类型的对象上找不到属性“label”) 我尝试在.h文件中添加NSString属性,该属性可以访问,但当我尝试将outlet从.m文件更改为.h文件时,无法在.h文件中按住ctrl键并拖动视图 我从来没有这个问题。过去我曾多次从.m文件访问outlet,但现在它只是给了我警告。 在.m文件中导出时,如何访问属性 无法在.h文件中导出属性。您必须将导出属性从.

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

我试图从其他类访问outlet属性,但总是发出红色警告(在MigrationVC*类型的对象上找不到属性“label”)

我尝试在.h文件中添加NSString属性,该属性可以访问,但当我尝试将outlet从.m文件更改为.h文件时,无法在.h文件中按住ctrl键并拖动视图

我从来没有这个问题。过去我曾多次从.m文件访问outlet,但现在它只是给了我警告。 在.m文件中导出时,如何访问属性


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

您必须将导出属性从
.m
文件传输到
.h
文件(复制并粘贴)。如果您希望属性是公共的,那么必须在头文件中声明它们。如果您希望它们是私有的,请在实现文件中声明它们

//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;
        });
    }
}
//MigrationVC.h
#进口
#进口
@接口迁移VC:UIViewController
@属性(强,非原子)IBUILabel*标签;
@属性(强,非原子)IBUIProgressView*progressView;
@结束
//迁移VC.m
#导入“MigrationVC.h”
@接口迁移VC()
@结束
@迁移VC的实现
@结束

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

正如其他人所指出的,如果希望从其他类访问属性,则需要在头文件中声明属性。你可以,而且你应该。如果你认为你做不到,解释原因

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


相反,您应该在视图控制器中创建数据属性(如字符串或浮点进度值)并公开这些属性。然后让视图控制器的viewWillExample方法根据需要将数据安装到其视图中。这样,数据属性就成为视图控制器的公共契约的一部分,而不必与视图控制器的内部详细信息绑定。

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

//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
应该是

@property (nonatomic,retain) MigrationVC *migrationVC;

MigrationVC
中,您的
出口应
而不是
并且在.h中才能从
CoreData.m

访问“label”属性。您如何以及在哪里尝试访问该属性?添加了我尝试访问它的部分问题是您在.m文件中声明了属性。将
@property
声明移动到.h文件中。我不能!!如果我可以的话,这就不会是个问题,问题是我不能把它放进去file@hengecyche没关系。只需将其导出到
.m
文件,然后使用
IBOutlet
剪切行,并将其粘贴到
.h
文件中。谢谢,我会记住这一点。现在我只是在玩Cocoa Classes。即使在“玩”的时候,遵循良好的设计实践也是一个好主意。毕竟,玩是我们了解世界的方式。
@property (nonatomic,strong) MigrationVC *migrationVC;