我有一个名字的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 =nil
和userName = Variable is not CFString
ARC设置为NO
答案 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方法。
编辑解决方案:
答案 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;
}
你必须正确地启动它,因为它的两个视图共享信息。