如何使用基于头像选择的适当用户名填充文本字段

时间:2015-11-17 18:54:35

标签: ios objective-c

我构建了以下方法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];
        }
    }
}

1 个答案:

答案 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来启用它。