0

に入るのに本当に苦労NSStringするNSURL

NSURL *url = [NSURL URLWithString:@"http://.../social.php"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    for(id entry in JSON)
    {
        strTwitter= [entry valueForKeyPath:@"str1"];
        strFacebook =[entry valueForKeyPath:@"str2"];
        CCLOG(@"twitter: %@", strTwitter);
    }
} failure:nil];

[operation start];

他の場所...

[[UIApplication sharedApplication] openURL:[NSURL URLWithString: strTwitter]]; 

そして、私は次のNSURL行でクラッシュしますEXC_BAD_ACCESS

mainMenu.h

@interface mainMenuLayer : CCLayer
{
    NSString *strTwitter;
}

CCLOG は URL を正常に出力します - スペースはありません。httpsなどを持っています...?

.h

#import "cocos2d.h"

#import "menuHome.h"
#import "menuMenu.h"
#import "AFJSONRequestOperation.h"


@interface mainMenuLayer : CCLayer
{
    CCSprite *Background;
    CCSprite *logoBackground;
    CCSprite *logoName;
    menuHome *theMenuHome1;
    menuMenu *theMenuMenu1;

    CGSize size;
    CCMenu *bottomMenu;
    CCMenu *bottomMenu2;
    CCMenuItemImage *menuHouse;
    CCMenuItemImage *menuMenu2;
    CCMenuItemImage *menuPictures;
    CCMenuItemImage *menuContact;
    CCMenuItemImage *menuMore;    
    CCMenuItemImage *menuTemp;  

    CCMenuItemImage *menuTwitter;
    CCMenuItemImage *menuFacebook;
    CCMenuItemImage *menuWebsite;
    CCMenuItemImage *menuAbout;
    CCMenuItemImage *menuBlank;

    NSString *strTwitter;
    NSString *strFacebook;

    NSInteger moreVisible;

}
// returns a CCScene that contains the HelloWorldLayer as the only child
+(CCScene *) scene;

-(void) funcHome;
-(void) funcMore;
-(void) funcMenu2;


+(mainMenuLayer*) sharedMenuScene;
@end

.m

#import "mainMenu.h"
#import "constants.h"

@interface mainMenuLayer ()
@property(nonatomic, strong) NSString *strTwitter;
@end

// HelloWorldLayer implementation
@implementation mainMenuLayer

@synthesize strTwitter;


static mainMenuLayer *sharedMenuScene;

+(mainMenuLayer*) sharedMenuScene {
    NSAssert(sharedMenuScene != nil, @"not yet initilized");
    return sharedMenuScene;
}

+(CCScene *) scene
{
    // 'scene' is an autorelease object.
    CCScene *scene = [CCScene node];

    // 'layer' is an autorelease object.
    mainMenuLayer *layer = [mainMenuLayer node];

    // add layer as a child to scene
    [scene addChild: layer];

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
-(id) init
{
    // always call "super" init
    // Apple recommends to re-assign "self" with the "super" return value
    if( (self=[super init])) {


        sharedMenuScene = self;
        // create and initialize a Label
        self.isTouchEnabled = YES;

        [[CCDirector sharedDirector]enableRetinaDisplay:YES];


        // ask director the the window size
        size = [[CCDirector sharedDirector] winSize];
        moreVisible = 0;


        //theMenuHome1.position = ccp(0.0f, 0.0f);

        logoBackground = [CCSprite spriteWithFile:@"logo_bg_640x120.png"];    
        [self addChild:logoBackground z: depthLevelMenu];
        logoBackground.position = ccp( size.width / 2, size.height - 30);

        logoName = [CCSprite spriteWithFile:@"res_name.png"];    
        [self addChild:logoName z: depthLevelMenuLogo];
        logoName.position = ccp( size.width / 2, size.height - 30);

        Background = [CCSprite spriteWithFile:@"background.png"];    
        [self addChild:Background z: depthLevelBackground];
        Background.position = ccp( size.width / 2, size.height / 2);

        menuHouse = [[CCMenuItemImage itemFromNormalImage:@"home_128x100_unselect.png" selectedImage:@"home_128x100_select.png" target:self selector:@selector(funcHome:)]retain];

        menuHouse.position =  ccp( 32, 25 );

        menuContact = [[CCMenuItemImage itemFromNormalImage:@"contact_128x100_unselect.png" selectedImage:@"contact_128x100_select.png" target:self selector:@selector(funcHome:)]retain];

        menuContact.position =  ccp( 96, 25 );

        menuMenu2 = [[CCMenuItemImage itemFromNormalImage:@"menu_128x100_unselect.png" selectedImage:@"menu_128x100_select.png" target:self selector:@selector(funcHome:)]retain];

        menuMenu2.position =  ccp( 160, 25 );

        menuPictures = [[CCMenuItemImage itemFromNormalImage:@"photos_128x100_unselect.png" selectedImage:@"photos_128x100_select.png" target:self selector:@selector(funcHome:)]retain];

        menuPictures.position =  ccp( 224, 25 );

        menuMore = [[CCMenuItemImage itemFromNormalImage:@"more_128x100_unselect.png" selectedImage:@"more_128x100_select.png" target:self selector:@selector(funcMore:)]retain];

        menuMore.position =  ccp( 288, 25 );


        bottomMenu = [CCMenu menuWithItems: menuHouse, menuContact, menuMenu2, menuPictures, menuMore, nil];
        bottomMenu.position =  CGPointZero;

        [self addChild: bottomMenu z:depthLevelMenu];
        [menuHouse selected];

        [self getSettings];
    }
    return self;
}


-(void) getSettings
{
    NSURL *url = [NSURL URLWithString:@"http://.../social.php"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        for(id entry in JSON)
        {
            strTwitter= [entry valueForKeyPath:@"str1"];
            strFacebook =[entry valueForKeyPath:@"str2"];
            CCLOG(@"twitter: %@", strTwitter);
        }
    } failure:nil];

    [operation start];

}


-(void) funcMenu2: (id) sender
{
    CCLOG(@"funcMenu2 Called");
    [menuTwitter unselected];
    [menuFacebook unselected];
    [menuWebsite unselected];
    [menuAbout unselected];
    [menuBlank unselected];
    [menuMore unselected];


    if(sender == menuTwitter)
    {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString: strTwitter]]; 
        CCLOG(@"url: %@", strTwitter);

        CCLOG(@"Twitter Selected");
        [sender selected];

    }
}
4

2 に答える 2

3

strTwitter はどのようにインスタンス化されますか? 発売前に発売されたようです

[[UIApplication sharedApplication] openURL:[NSURL URLWithString: strTwitter]];

声明

strTwitter のプライベート プロパティを作成します (これを .m ファイル内に配置します。

@interface mainMenuLayer ()
    @property(nonatomic, strong) NSString *strTwitter;
@end

次に、のすぐ下@implementation mainMenuLayer

@synthesize strTwitter;

もう1つの注意点は、クラスを定義するときに適切な大文字と小文字を使用する習慣を身に付ける必要があることです: MainMenuLayer と mainMenuLayer

于 2012-04-03T23:21:19.407 に答える
1

change "strTwitter= [entry valueForKeyPath:@"str1"];" に

self.strTwitter= [エントリ値ForKeyPath:@"str1"];

これにより、自動生成されたセッターによって確実に保持されます。strTwitter を割り当てる方法は、セッターを回避し、保持されていないオブジェクトをそれに割り当てるだけです。代入するときは「self.{property} = {some value}」と呼ぶのを習慣にしています。

于 2012-04-04T01:17:13.577 に答える