NSMutableArray到NSString并将NSString传递给另一个视图IOS5.1

时间:2012-06-25 02:50:29

标签: objective-c ios nsstring nsmutablearray

我有一个名字的NSMutableArray。我希望将NSMutableArray内部的数据(选定名称)作为文本传递给另一个视图的标签。

FriendsController.m:

- (void)viewDidLoad {
    [super viewDidLoad];
    arrayOfNames=[[NSMutableArray alloc] init];
    arrayOfIDs=[[NSMutableArray alloc] init];
    userName=[[NSString alloc] init];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    long long fbid = [[arrayOfIDs objectAtIndex:indexPath.row]longLongValue];
    NSString *user=[NSString stringWithFormat:@"%llu/picture",fbid];
    [facebook requestWithGraphPath:user andDelegate:self];

    userName=[NSString stringWithFormat:@"%@",[arrayOfNames objectAtIndex:indexPath.row]];
    FriendDetail *profileDetailName = [[FriendDetail alloc] initWithNibName: @"FriendDetail" bundle: nil];

    profileDetailName.nameString=userName;

    [profileDetailName release];
}

- (void)request:(FBRequest *)request didLoad:(id)result  {
    if ([result isKindOfClass:[NSData class]]) {
        transferImage = [[UIImage alloc] initWithData: result];
        FriendDetail *profileDetailPicture = [[FriendDetail alloc] initWithNibName: @"FriendDetail" bundle: nil];

        [profileDetailPicture view];
        profileDetailPicture.profileImage.image= transferImage;

        profileDetailPicture.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self presentModalViewController:profileDetailPicture animated:YES];

        [profileDetailPicture release];
    }   
} 

在FriendDetail.h中

NSString nameString;
IBOutlet UILabel *profileName;
@property (nonatomic, retain) UILabel *profileName;
@property (nonatomic, retain) NSString *nameString;

在FriendDetail.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    profileName.text=nameString;
}
第二个控制器(FriendDetail)中的

nameString返回nil。当我在firstcontroller中设置断点时,我看到nameString内的字符串是正确的,但之后它以某种方式返回nil

----------------------- EDIT ----------------------- -----------------

根据答案,我对我的代码进行了一些改进 FriendsController.h

 FriendDetail *friendController;
@property (strong, nonatomic) FriendDetail *friendController;

FriendsController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    arrayOfNames=[[NSMutableArray alloc] init];
    arrayOfIDs=[[NSMutableArray alloc] init];
    arrayOfThumbnails=[[NSMutableArray alloc] init];
    userName=[[NSString alloc] init];

    friendController= [[FriendDetail alloc] initWithNibName: @"FriendDetail" bundle: nil];
}

-(void)request:(FBRequest *)request didLoad:(id)result{
    if ([result isKindOfClass:[NSData class]])
    {
        transferImage = [[UIImage alloc] initWithData: result];
        friendController.nameString=userName;

        [friendController view];
        friendController.profileImage.image= transferImage;


       friendController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self presentModalViewController:friendController animated:YES];
    }
   //this is how i take facebook friends list
         if ([result isKindOfClass:[NSDictionary class]]){
             items = [[(NSDictionary *)result objectForKey:@"data"]retain];
             for (int i=0; i<[items count]; i++) {
            NSDictionary *friend = [items objectAtIndex:i];
            long long fbid = [[friend objectForKey:@"id"]longLongValue];
            NSString *name = [friend objectForKey:@"name"];
            NSLog(@"id: %lld - Name: %@", fbid, name);
            [arrayOfNames addObject:[NSString stringWithFormat:@"%@", name]];
            [arrayOfIDs addObject:[NSNumber numberWithLongLong:fbid]];

        }
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    long long fbid = [[arrayOfIDs objectAtIndex:indexPath.row]longLongValue];
    NSString *user=[NSString stringWithFormat:@"%llu/picture",fbid];

    userName=[NSString stringWithFormat:@"%@",[arrayOfNames objectAtIndex:indexPath.row]];

    [facebook requestWithGraphPath:user andDelegate:self]; 
    [username retain]
}

现在,当我第一次选择行时,它会发送名称。当我回到tableview并选择另一个名称时,它会显示旧名称。

如果我删除了[username retain]中的didSelectRowAtIndexPath:,它仍会将nil发送给nameString

当我在didSelectRowAtIndexPath:处设置断点

userName=[NSString stringWithFormat:@"%@",[arrayOfNames objectAtIndex:indexPath.row]]`

我可以看到userName = @"Adam Dart"哪个是正确的

在第friendController.nameString=userName;行的第二个断点中,我看到nameString =niluserName = Variable is not CFString

ARC设置为NO

4 个答案:

答案 0 :(得分:2)

该值为nil,因为您没有传递request:didLoad:函数中的值。

在函数didSelectRowAtIndexPath中,您创建另一个ViewController的本地实例并设置nameString的值,但是您没有显示视图并立即释放ViewController。你实际上在这几行代码中什么都不做:

FriendDetail *profileDetailName = [[FriendDetail alloc] initWithNibName: @"FriendDetail" bundle: nil];
profileDetailName.nameString = userName;
[profileDetailName release];

在函数request:didLoad:中,再次使用image创建另一个ViewController的本地实例。但是这个实例只是这个函数的本地实例,这意味着与didSelectRowAtIndexPath中创建的实例无关。

您需要做的是,首先记住didSelectRowAtIndexPath中点击行的名称,此处您不必创建ViewController实例。请求完成后,将图像和名称都设置为控制器,然后显示它。但是你应该避免用户同时点击不同的行,因为你不知道请求何时结束。

答案 1 :(得分:1)

你有两个名为profileDetailPicture的FriendDetail实例。这两个profileDetailPicture都不一样。因此,在didSelectRowAtIndexPath方法中,您分配给nameString的值将不会显示/可用于profileDetailPicture的nameString在请求中:(FBRequest *)请求didLoad方法。

编辑解决方案:

  1. 在FriendController中创建一个iVar或属性(profileDetailPicture)。
  2. 只在请求中执行一次分配:(...)方法。
  3. 删除didSelectRowAtIndexPath中的分配语句。

答案 2 :(得分:0)

是否有可能与您分配到profileDetailName并立即释放它的事实有关?

profileDetailName.nameString=userName;
[profileDetailName release];

答案 3 :(得分:0)

你必须在“second_controller”中分配“first_controller” 传递诸如字符串之类的对象。你会以不同的方式调用nameString。

示例:

<强> second_controller.h

#import "first_controller.h"
...
@interface second_controller : UIViewController{
   first_controller* firstController;
}

<强> second_controller.m

- (void)viewDidLoad {
    [super viewDidLoad];
    firstController = [[first_controller alloc] init];
    profileName.text = firstController.nameString;
}

你必须正确地启动它,因为它的两个视图共享信息。