无法访问另一个类的@property

时间:2012-12-19 08:04:20

标签: iphone objective-c ios cocoa-touch

这里有一个真正的菜鸟问题。 我有2个VC。 一个叫SGPlayer,另一个叫SGDownloader。基本上我想从第一堂课改变SGDownloader的属性。 我像这样导入SGDownloader类:

//  SGPlayer.h

#import <UIKit/UIKit.h>
#import "SGDownloader.h"

@interface SGPlayer : UIViewController

@property (nonatomic, retain) SGDownloader *downloaderClass;

SGPlayer.m是这样的:

//  SGPlayer.m

#import "SGPlayer.h"

@interface SGPlayer ()

@end

@implementation SGPlayer
@synthesize downloaderClass;

然后,我在SGDownloader触发的操作中将downloadUrl属性设置为UIButton类,如下所示:

- (IBAction)loadURLButton:(id)sender {

    [self performSegueWithIdentifier:@"loadMyData" sender:nil];
    downloaderClass.downloadURL = [NSURL URLWithString:@"http://www.google.com"];
}

NSLog在我的网址上给了我(null)。如果我使用prepareForSegue方法,一切都很好:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"loadMyData"])
    {
        SGDownloader *vc = [segue destinationViewController];

        vc.downloadURL = [NSURL URLWithString:@"http://www.google.com"];
    }
}

事情是我不希望在这里使用prepareForSegue

我认为我可能误解了如何在Obj-C中的类之间传输数据的整个概念。

修改

我在SGDownloader类中有合成属性:

@interface SGDownloader : UIViewController

@property (nonatomic, retain) NSURL *downloadURL;

@end

6 个答案:

答案 0 :(得分:3)

你好downloadURL

的属性
@property (nonatomic, retain) NSUrl * downloadURL;

答案 1 :(得分:3)

创建downloadURL的属性并合成它,或者你可以使用委托在类之间传递值

答案 2 :(得分:3)

如上所述,当您尝试设置属性时,downloaderClass为零。因此,在设置之前,您可以使用self.downloaderClass = [[SGDownloader alloc] init....]

然后你必须确保当你切换视图控制器时你正在使用这个实例而不是故事板实例化的那个(在这里不能帮助,因为我没有使用故事板)。

答案 3 :(得分:2)

您的downloaderClass属性似乎是nil,而不仅仅是downloadURL。这就是你得到null的原因。在prepareForSegue中,它是从故事板中为您实例化的,我建议您在那里使用它。

希望这有帮助!

答案 4 :(得分:2)

不幸的是,你不会显示完整的代码。我想如果你的self.downloaderClass不是nil,如前所述,则它是oyur视图控制器的一个不同的实例,而不是segue.destinationViewController。您可能已经创建了一个实例,但这并不能阻止故事板创建自己的实例。

我建议在使用storyboard时使用prepareForSegue。仅仅因为这种方法就是为了这个目的而设计的。

BTW,downloaderClass不是该对象最聪明的名称,因为它不引用类(可能是类型*的属性),而是引用实际的实例。 {“1}}左右在”口译代码“方面更合适。但是,这不会导致您的问题。

当然,必须可以从该类外部访问downloadURL。这也需要是一个财产。另一方面,它似乎是从一个恒定的字符串值中获得的。如果这是真的并且在您的项目继续进行时仍然如此,那么从外部设置值是没有意义的。你也可以在类中的适当的init方法中设置它。

答案 5 :(得分:-1)

在分配属性之前,您需要为SGDownloader *downloaderClass提供内存。 在使用downloaderClass之前使用 alloc