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]]; 

然后我崩溃NSURLEXC_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;

另一个注意事项是,您应该养成在定义类时使用正确大小写的习惯:MainMenuLayer vs mainMenuLayer

于 2012-04-03T23:21:19.407 回答
1

更改“strTwitter= [entry valueForKeyPath:@"str1"];" 至

self.strTwitter= [entry valueForKeyPath:@"str1"];

这将确保它被自动生成的设置器保留。您分配 strTwitter 的方式回避了 setter,只是将未保留的对象分配给它。我习惯在分配时调用“self.{property} = {some value}”。

于 2012-04-04T01:17:13.577 回答