如何将5种不同的头像应用于5种不同的UIButton?

时间:2015-03-25 05:12:04

标签: ios objective-c core-data xcode6

我正在创建5个UIButton,使用for循环,并希望在UIButtons上放置5个不同的头像。但是,只有一个头像填充了所有5个按钮。

我构建的代码如下所示,

    // create a subview for avatar buttons
    UIView *avatarView = [[UIView alloc] init];
    avatarView.frame = CGRectMake(20, 125, 280, 100); // don't mess with these values.
//    avatarView.layer.borderColor = [UIColor redColor].CGColor;
//    avatarView.layer.borderWidth = 3.0f;
    [self.view addSubview:avatarView];

    UIScrollView *avatarScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height)];
    avatarScroll.contentSize = CGSizeMake(500, 500);
    avatarScroll.scrollEnabled = YES;
    [avatarView addSubview:avatarScroll];


    // fetch Data from Core Data
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:_managedObjectContext];
    [fetchRequest setEntity:entity];

    // fetch records and handle error
    NSError *error;
    NSArray *results = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];

    // sort results array by lastLogin
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"lastLogin" ascending:NO];
    NSArray *sortedArray = [NSArray arrayWithObject:sort];
    NSArray *sortedArray2 = [results sortedArrayUsingDescriptors:sortedArray];
    // how to remove values from NSArray
    NSArray *lastLoginArray = [sortedArray2 valueForKey:@"lastLogin"];
//    NSLog(@"lastLoginArray = %@",lastLoginArray);
    // make an array that only hold 5 values
//    NSArray *last5LoginArray;
//    for (int i=5; i<[lastLoginArray count]; i++) {
//        [last5LoginArray addObject:[lastLoginArray objectAtIndex:i]];
//    }
//    NSLog(@"last5LoginArray = %@",last5LoginArray);
//    NSArray *last5LoginArray = [NSArray arrayWithObjects:lastLoginArray count:4];
//    NSArray *last5LoginArray = [NSArray arrayByAddingObjectsFromArray:lastLoginArray count:4];
    NSMutableArray *last5LoginArray = [[NSMutableArray alloc] initWithArray:[lastLoginArray subarrayWithRange:NSMakeRange(0, 5)] ];
    NSLog(@"last5LoginArray = %@",last5LoginArray);

//    NSLog(@"sortedArray2 = %@",sortedArray2);

    CGFloat staticX = 0;
    CGFloat staticWidth = 80;
    CGFloat staticHeight = 80;
    CGFloat staticPadding = 5;

    // need to put the avatars stored in sortedArray2 in the scrollView
    for ( int i = 0; i < 5; i++) {
        // do additional loading for avatars
        UIButton *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;
        // create a stock image
        UIImage *btnImage = [UIImage imageNamed:@"HomeBrewPoster1.jpg"];
        Account *anAccount;
        for ( anAccount in results) {
            if([last5LoginArray containsObject:anAccount.lastLogin]) {
                NSLog(@"anAccount.lastLogin = %@",anAccount.lastLogin);
                UIImage *avatarImg = [UIImage imageWithData:anAccount.avatar ];
                // apply avImg to btn
                [avatarButton setBackgroundImage:avatarImg forState:UIControlStateNormal];
            }
        }
        if (btnImage == nil) {
            NSLog(@"can't find HomeBrewPoster1.jpg");
            // apply stock image to button(s)
            [avatarButton setBackgroundImage:btnImage forState:UIControlStateNormal];
        } else {

        }
    // this should add 5x buttons
    [avatarScroll addSubview:avatarButton];
    }

3 个答案:

答案 0 :(得分:1)

您最内层的for-in循环始终将最后匹配的头像设置为按钮,因为i的当前值与最内层循环的作用完全没有区别。< / p>

您应该将嵌套循环移到第一个循环之外以预先准备五个头像,然后使用i索引到头像数组中,如下所示:

NSMutableArray *avatars = [NSMutableArray arrayWithCapacity:5];
for ( anAccount in results) {
    if([last5LoginArray containsObject:anAccount.lastLogin]) {
        NSLog(@"anAccount.lastLogin = %@",anAccount.lastLogin);
        UIImage *avatarImg = [UIImage imageWithData:anAccount.avatar ];
        [avatars addObject:avatarImg];
    }
}
NSAssert(
    avatars.count == last5LoginArray.count
,   @"The loop is expected to find as many avatars as there are items in last5LoginArray"
);
for ( int i = 0; i < 5; i++) {
    ...
    // Check that we have enough logins
    if (i < last5LoginArray.count) {
        [avatarButton setBackgroundImage:avatars[i] forState:UIControlStateNormal];
    }
}

答案 1 :(得分:1)

将按钮声明为数组

NSArray *arrImages = [NSArray arrayWithObjects:@"1.jpg",@"2.jpg",@"3.jpg",@"4.jpg",@"5.jpg", nil];
UIButton *button[5];
button[i] = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button[i] addTarget:self action:@selector(aMethod:) forControlEvents:UIControlEventTouchUpInside];
[button[i] setBackgroundImage:[UIImage imageNamed:[arrImages objectAtIndex:i]] forState:UIControlStateNormal];
[button[i] setTitle:@"Title" forState:UIControlStateNormal];
button[i].frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
[avatarScroll addSubview:button[i]];

答案 2 :(得分:0)

您可以将图像命名为&#34; HomeBrewPoster0&#34;,&#34; HomeBrewPoster1&#34;等等。并添加此图片以在您的循环中选择正确的图像:

 UIImage *btnImage = [UIImage imageNamed:[NSString stringWithFormat:@"HomeBrewPoster%ld.jpg", i]];