1

ここで本当に初心者の質問です。私は2つのVCを持っています。1 つは呼び出されSGPlayer、もう 1 つは ですSGDownloaderSGDownloader基本的にファーストクラスからのプロパティを変更したい。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のプロパティを作成して合成するか、デリゲートを使用してクラス間で値を渡すことができます

于 2012-12-19T08:15:48.753 に答える
3

こんにちはのプロパティを作成しますdownloadURL

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

上記のようにdownloaderClass、プロパティを設定しようとすると nil になります。したがって、設定する前に使用できますself.downloaderClass = [[SGDownloader alloc] init....]

次に、View Controllerを切り替えるときに、ストーリーボードによってインスタンス化されたインスタンスではなく、このインスタンスを使用していることを確認する必要があります(ストーリーボードを使用していないため、ここでは役に立ちません)。

于 2012-12-19T08:45:56.190 に答える
2

あなたのdownloaderClass物件はnilだけではなく のようdownloadURLです。それがあなたがnullになる理由です。ストーリーボードからインスタンス化される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 に答える