UITableViewCell自定义添加到收藏夹按钮问题

时间:2015-06-10 14:31:40

标签: ios objective-c uitableview uibutton

在我的表视图中,我在每个单元格中放置了一个自定义的“添加到收藏夹”按钮,以使用户能够将确切的单元格内容复制到第二个tableview控制器。当您点击“添加到收藏夹”按钮时,会出现一个警报视图,询问您是否要复制单元格并将其粘贴到第二个视图控制器。现在有两件事。 1-如果从警报视图中选择“确定”以指示单元格被复制并粘贴到第二个表视图,是否有一种方法可以永久地从该单元格中删除“添加到收藏夹”按钮? - 因此用户将无法一遍又一遍地添加单元格内容。 2-这是一个更大的问题:如何通过“添加到收藏夹”点击将单元格内容复制并粘贴到secondtableview控制器?

这是我的单元格重新配置的方式:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

    NSString* letter = [letters objectAtIndex:indexPath.section];
    NSArray* arrayForLetter = (NSArray*)[filteredTableData objectForKey:letter];
    Songs* songs = (Songs*)[arrayForLetter objectAtIndex:indexPath.row];

    cell.textLabel.text = songs.name;
    cell.detailTextLabel.text = songs.description;

    CGSize itemSize = CGSizeMake(50, 50);
    UIGraphicsBeginImageContextWithOptions(itemSize, NO, UIScreen.mainScreen.scale);
    CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
    [cell.imageView.image drawInRect:imageRect];
    cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIButton *addtoFavsButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    addtoFavsButton.frame = CGRectMake(200.0f, 5.0f, 105.0f, 70.0f);
    [addtoFavsButton setImage:[UIImage imageNamed:@"fav.png"] forState:UIControlStateNormal];
    [addtoFavsButton setTintColor:[UIColor whiteColor]];
    [cell addSubview:addtoFavsButton];
    [addtoFavsButton addTarget:self
                        action:@selector(addtoFavs:)
              forControlEvents:UIControlEventTouchUpInside];
    return cell;
    }
- (IBAction)addtoFavs:(id)sender
{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Dikkaaaat!"
                                                   message:@"Şarkıyı Favori Akorlarınıza Alıyorsunuz..."
                                                  delegate:nil
                                         cancelButtonTitle:@"Cancel"
                                         otherButtonTitles:@"OK", nil];
            [alert show];
    }

enter image description here enter image description here

4 个答案:

答案 0 :(得分:1)

考虑到数据仅在应用程序中,并且考虑到您使用的是常规表格单元格,而不是自定义表格单元格,我建议使用的是:

  • 在您的应用中创建一个名为" myFavorites"或者其他什么,它只包含一个数值列表。

  • 当用户确认添加到收藏夹时,从歌曲数组中获取当前的节和行索引,并存储在这个新阵列中。

  • 在您的第一个视图控制器中,添加到" cellForRowAtIndexPath"一个简单的检查,看看该行的歌曲是否存在于新数组中。

类似的东西:

 if([[myFavorites objectAtIndex:indexPath.section] containsObject:[NSString stringWithFormat:@"%ld", (long)indexPath.row]]){
     // Don't make button because is already a favorite.
 }else{
     // Make button because not yet a favorite.
 }

您的第二个表视图几乎完全相同,除了在" cellForRowAtIndexPath"的顶部附近,执行类似的检查:

if([[myFavorites objectAtIndex:indexPath.section] containsObject:[NSString stringWithFormat:@"%ld", (long)indexPath.row]]){
     // Is a favorite, so put regular cell stuff here to have the cell show
     ....

 }else{
     // Not a favorite, don't generate cell.
     cell.visible = NO;
     return cell;
 }

你还可以做其他事情,但是需要将你的设置从常规单元格更改为具有新类和属性的自定义单元格,所以实现起来要复杂一点,但实际上仍然相当于相同的输出/处理。

答案 1 :(得分:0)

首先,您没有复制和粘贴 - 您正在引用。具体来说,你说有些<%@ Page是特殊的。

其次,用户应该能够判断它们是否特殊,并且能够切换它。通过警报进行分配,只需显示按钮上的状态,并在点击时打开和关闭特殊设置。

现在,第二个表视图的工作方式与第一个相同,它只是过滤songs来决定要显示的内容。

您需要决定如何将每首歌曲标记为特殊歌曲,可能是通过向该类添加布尔属性并将其与其余数据一起保存。另一种方法是拥有单独的歌曲ID(或唯一名称)列表。

答案 2 :(得分:0)

如果要更改单元格,则需要将自定义视图设置为@property。

@property (nonatomic, strong) UIView *cellContent;

然后在cellForRowAtIndexPath中设置

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }
    [cell.contentView addSubview:[self setupCellContentView:indexPath]];
    return cell;
}

- (UIView *)setupCellContentView:(NSIndexPath *)indexPath
{
    if (!_cellContent) {
        _cellContent = [[UIView alloc] initWithFrame:CGRectZero];
    }
    // do sth like you did in cellForRowAtIndexPath//
    return _cellContent;
}

然后你可以操纵alertView:clickedButtonAtIndex:中的cell.contentView 并将视图@property (nonatomic, strong) UIView *cellContent传递给下一个viewController

ps:从_cellContent中删除“添加到收藏夹”按钮后,不要忘记

[_cellContent removeFromSuperview];

[tableView reloadData];

答案 3 :(得分:0)

要回答第一个问题,,您可以从单元格对象中删除“添加到收藏夹”按钮,但由于{{1}这一事实会导致其余的歌曲显示出现问题重用单元格对象。因此,如果您标记了一个单元格并删除了它的按钮,则任何即将重新使用此对象的行都将无法向用户显示该最喜欢的按钮。 所以你最好放弃这种方法。

要维护或复制单元格的内容,这只是对主数组中UITableView对象的引用,您可以创建另一个fav歌曲数组并将这些Songs对象添加到这个数组。现在,您可以从主阵列中删除此歌曲对象并重新加载表格数据。如果您使用2个不同的表视图进行数据显示,则此方法适用。

如果您通过“Fav Icon”指示在一个表格视图中显示两种类型的歌曲,那么您应该将Songs属性添加到BOOL模型对象,并在您通过警报确认时进行设置图。