1

这里是一个非常菜鸟的问题。我有 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在我的 URL 上给我 (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
4

6 回答 6

3

嗨,使财产downloadURL

@property (nonatomic, retain) NSUrl * downloadURL;
于 2012-12-19T08:09:01.697 回答
3

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

于 2012-12-19T08:15:48.753 回答
3

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

然后,您必须确保当您切换视图控制器时,您正在使用此实例,而不是由情节提要实例化的实例(这里无法提供帮助,因为我没有使用情节提要)。

于 2012-12-19T08:45:56.190 回答
2

看来您的downloaderClass财产是nil,而不仅仅是它downloadURL。这就是你得到空值的原因。在prepareForSegue它是从情节提要中为您实例化的,我建议您在那里使用它。

希望这可以帮助!

于 2012-12-19T08:13:45.413 回答
2

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

我宁愿建议prepareForSegue在使用情节提要时使用。仅仅是因为这种方法正是为此目的而设计的。

顺便说一句,downloaderClass这不是该对象最聪明的名称,因为它不是指一个类(这将是 Class* 类型的属性),而是指一个实际实例。downloadViewController就“说代码”而言,左右会更合适。但是,这不会导致您的问题。

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

于 2012-12-19T09:13:00.487 回答
-1

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

于 2012-12-19T08:12:10.927 回答