2

名前の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;
}

nameString2番目のコントローラー(FriendDetail)で。を返しますnil。firstcontrollerにブレークポイントを設定すると、内部の文字列が正しいことがわかりますが、その後は何とかnameString戻ります。nil

- - - - - - - - - - - -編集 - - - - - - - - - - - - - --------------

回答によると、コードを少し改善しました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]
}

これで、最初に行を選択すると、名前が送信されます。テーブルビューに戻って別の名前を選択すると、古い名前が表示されます。

削除[username retain]didSelectRowAtIndexPath: てもnilnameString

didSelectRowAtIndexPath:行`にブレークポイントを設定したとき

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

userName = @"Adam Dart"どちらが正しいかわかります

行の2番目のブレークポイントfriendController.nameString=userName;nameString =niluserName = Variable is not CFString

ARCはNOに設定されています

4

4 に答える 4

2

関数に値を渡さなかったため、値はnilですrequest:didLoad:

関数didSelectRowAtIndexPathでは、別のViewControllerのローカルインスタンスを作成し、nameStringの値を設定しましたが、ビューを表示せず、ViewControllerをすぐに解放しました。これらの数行のコードでは、実際には何もしません。

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

関数request:didLoad:では、ここでも、画像を使用して別のViewControllerのローカルインスタンスを作成します。ただし、このインスタンスはこの関数に対してのみローカルであり、で作成されたものとは関係がないことを意味しdidSelectRowAtIndexPathます。

あなたがする必要があるのは、最初にクリックされた行の名前を覚えておくことですdidSelectRowAtIndexPath。ここでは、ViewControllerインスタンスを作成する必要はありません。リクエストが終了したら、画像と名前の両方をコントローラーに設定して提示します。ただし、リクエストがいつ終了するかわからないため、ユーザーが同時に別の行をクリックすることは避けてください。

于 2012-06-25T03:22:13.390 に答える
1

profileDetailPictureというFriendDetailの2つのインスタンスがあります。これらのprofileDetailPictureは両方とも同じではありません。したがって、didSelectRowAtIndexPathメソッドでは、nameStringに割り当てた値は、request:(FBRequest *)requestdidLoadメソッドのprofileDetailPictureのnameStringには表示/使用できません。

解決策のために編集:

  1. FriendControllerにiVarまたはプロパティ(profileDetailPicture)を作成します。
  2. request:(...)メソッドで1つの割り当てのみを実行します。
  3. didSelectRowAtIndexPathの割り当てステートメントを削除します。
于 2012-06-25T03:17:28.723 に答える
0

profileDetailNameあなたが割り当ててすぐにそれを解放するという事実と関係がある可能性はありますか?

profileDetailName.nameString=userName;
[profileDetailName release];
于 2012-06-25T02:59:46.873 に答える
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;
}

2つのビューが情報を共有しているため、正しく初期化する必要があります。

于 2012-06-25T03:01:30.060 に答える