我构建了以下方法fetchLastFiveLogins
,该方法成功地将用户头像添加到_avatarButton
。但是,当用户点击头像时,它会调用fillUserName
方法。该部分正在运行,但我无法弄清楚如何使用与头像关联的用户名填充_textfieldUsername
。以下是fetchLastFiveLogins
方法的摘要。
// sort / filter "results" to display the last five "lastLogin(s)"
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastLogin" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[request setFetchLimit:5];
[request setSortDescriptors:sortDescriptors];
// fetch records and handle error
NSError *error;
NSArray *results = [_managedObjectContext executeFetchRequest:request error:&error];
if (!results) {
// handle error
// also if there is login data handle error so app doesn't crash
}
Account *anAccount;
// create a stock image
UIImage *btnImage = [UIImage imageNamed:@"HomeBrewPoster1.jpg"];
NSMutableArray *avatars = [NSMutableArray arrayWithCapacity:5];
for ( anAccount in results) {
NSLog(@"results%@",anAccount.lastLogin);
if(anAccount.lastLogin) {
NSLog(@"anAccount.lastLogin = %@, by:%@",anAccount.lastLogin,anAccount.username);
if (anAccount.avatar != nil) {
UIImage *avatarImg = [UIImage imageWithData:anAccount.avatar ];
[avatars addObject:avatarImg];
}
else {
[avatars addObject:btnImage];
}
}
}
NSLog(@"avatars array%lu",(unsigned long)avatars.count);
for ( NSInteger i = 0; i < 4; i++) {
// Check that we have enough logins
if (i < results.count) {
NSLog(@"avatars =%@",avatars[i]);
CGFloat staticX = 0;
CGFloat staticWidth = 80;
CGFloat staticHeight = 80;
CGFloat staticPadding = 5;
_avatarButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
// the last two values control the size of the button
_avatarButton.frame = CGRectMake(0, 0, 80, 80);
[_avatarButton setFrame:CGRectMake((staticX + (i * (staticHeight + staticPadding))),5,staticWidth,staticHeight)];
// make corners round
_avatarButton.layer.cornerRadius = 40; // value varies -- // 35 yields a pretty good circle.
_avatarButton.clipsToBounds = YES;
// assign method / action to button
[_avatarButton addTarget:self action:@selector(fillUserName) forControlEvents:UIControlEventTouchDown];
[_avatarButton setBackgroundImage:[avatars objectAtIndex:i] forState:UIControlStateNormal];
NSLog(@"avatarImage = %@",[_avatarButton backgroundImageForState:UIControlStateNormal]);
[_avatarScroll addSubview:_avatarButton];
}
}
}
答案 0 :(得分:2)
第1步:使fillUserName
方法取参数fillUserName:(id) sender
,以便方法将传递按下的按钮。你需要调整addTarget,以便它使用@selector(fillUserName:)
(末尾有冒号)。
第2步:您需要能够区分按下哪个按钮。通常人们使用UIButton(和其他控件)的tag
属性来区分按钮。如果将标记设置为结果的数组索引,则标记为0的按钮是结果数组中的第0个条目。对于某些代码示例,请参阅此问题:How do i set and get UIButtons' tag?。
第3步:确保您已坚持对结果数组的引用,以便您可以使用fillUserName:
方法访问它。
更新:正如我在下面的评论中提到的,使用块的解决方案似乎是一个更好的解决方案,有些人已经编写了一些nice code来启用它。