2

私は数週間前に Objective-C プログラミングを始めたので、これらすべての部品がどのように組み合わされているか、およびそれらがすべて発生している順序を理解していないので、まだ混乱しています。NSURLSession を使用して、自分のアプリの 1 つに JSON API 呼び出しを行おうとしています。それはすべて問題なく機能しますが、返されたデータの一部でラベルを更新したいのですが、ラベルを見たり更新しようとすると、null になります。

私の問題に似ていることがわかったSOの投稿には、 thisthisthis、およびthisが含まれます。Ruby on Rails の世界から来た私は、非同期の概念を扱う必要はまったくありませんでしたが、近いことはわかっています。

問題のコードの関連スニペットは次のとおりです。

        if (!jsonError) {
            NSDictionary *skillBuildData = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

            dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"%@:", skillBuildNameLabel.text);  // should say "Build Name" but returns null
                    NSLog(@"%@", skillBuildData[@"name"]);    // correctly prints the result
                    NSLog(@"%@:", skillBuildNameLabel.text);  // should have contents of skillBuildData[@"name"] but returns null
                    skillBuildNameLabel.text = skillBuildData[@"name"]; // obviously results in null, but I don't know why.
            });
        }

編集:

関連性があるかどうかはわかりませんがViewController.h、この非常にシンプルなアプリのアウトレットとアクションのアイデアを提供するために、私の大部分を以下に示します. 1 つのボタン、1 つのメソッド、IBOutletボタンと JSON 呼び出しメソッドをリンクする 、およびラベル:

@interface ViewController : UIViewController {
    IBOutlet UILabel *skillBuildNameLabel;
    IBOutlet UIButton *getSkillBuildDataButton;
}

- (void)getSkillBuildDataById:(int) skillBuildId;

- (IBAction)buttonPressed;

私は非常に近くにいるようですが、見落としているリンクが表示されません。よろしくお願いします!

編集2:

回答としてマークした回答に対する Ben Kreeger のコメントを確認してください。ストーリーボードの実際のラベルを、ViewController.h. ストーリーボードの要素から実際のコード行に線をドラッグできるとは思いもしませんでした。それが欠けていたピースでした。Xcode と Objective-C について、まだまだ学ぶことがたくさんあるようです。私を助けてくれたすべての人に感謝します!

4

2 に答える 2

2

インスタンス変数としてではなく、IBOutletsプロパティ ( ) として宣言する方がうまくいく場合があります (理由については、ではなくこの回答を参照してください)。@propertyweakstrong

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *skillBuildNameLabel;
@property (weak, nonatomic) IBOutlet UIButton *getSkillBuildDataButton;

...

@end

次に、実装でそれらを参照できるようになりself.skillBuildNameLabelますself.getSkillBuildDataButton

self.xそのようなコールバック内のこの表記は、いわゆる保持サイクルにつながる可能性があることに注意してください。この場合、Xcode はこれについて警告します。ここでは、保持サイクルについて少し説明します

脚注: インスタンス変数を宣言するために、この構文を目にすることはめったにありません (そして書くこともありません)。

@interface ViewController : UIViewController {
    IBOutlet UILabel *skillBuildNameLabel;
    IBOutlet UIButton *getSkillBuildDataButton;
}

代わりにプロパティを使用してください。

于 2014-01-06T13:20:20.133 に答える
1

テキストを設定する前にロギングを行っています。動く

skillBuildNameLabel.text = skillBuildData[@"name"];

非同期ブロックの先頭、NSLog ステートメントの上。

于 2014-01-05T19:32:36.690 に答える