2015-03-25 46 views
1

我创建了5个UIButtons,使用for循环,并且想要在UIButton上放置5个不同的头像。但是,只有一个头像正在填充所有5个按钮。如何将5个不同的头像应用于5个不同的UIButton?

我已经构建如下所示的代码,

// 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]; 
    } 
+0

你相同的图像设置的按钮 – 2015-03-25 05:16:44

+1

@VNJ“但是,只有一个头像是填补所有的5个按钮。” <=我也注意到了。 – Chris 2015-03-25 05:18:15

回答

1

你的内心for-in回路始终将最后匹配头像按钮,因为i电流值,使什么的完全没有差异最内层的循环。

你应该移动的嵌套循环的第一循环外,制备五个化身前期,然后使用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]; 
    } 
} 
+0

非常感谢你。我很欣赏这个深思熟虑的答案。在一片仇敌的海洋中,看到一些人仍然在帮助......欢呼声令人耳目一新。 – Chris 2015-03-25 05:29:21

+0

无视以前的评论,我有用户谁没有头像,所以我认为'[头像addObject:avatarImg];'是导致应用程序崩溃。 – Chris 2015-03-25 06:19:22

+0

......是啊,我觉得我得到它,即时通讯上的解决方案,现在工作;) – Chris 2015-03-25 06:31:56

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]]; 
0

您可以命名您的图像,如“HomeBrewPoster0”,“HomeBrewPoster1”等,并添加此选择在循环右图:

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