事件发生时更改特定UITableViewCell的UIImage

时间:2015-10-29 16:58:18

标签: ios objective-c uitableview core-data uiimageview

我在UITableViewController中有一些简单UITableView个静态单元格。另一个UITableView UITableViewController正在填充prepareForSegue。这个UITableViewController有两个部分,第一部分是NSMutableArray字符串,第二部分是NSMutableArray,其中包含带字符串的.txt文件。有些“语言”只有一个部分,有些则有两部分。关于UITableView没有别的想法。通过使用本教程:http://www.appcoda.com/swipeable-uitableviewcell-tutorial/#disqus_thread,我已设法在单元格上实现自定义手势,因此我可以滑动单元格以将其标记为收藏夹。我必须在该教程中使用代码来将默认行为从Delete更改为Star,如下面的屏幕截图所示:

enter image description here

一旦用户选择了星形图像,我希望在细胞本身上有UIImage,表示该细胞已经加星标。

以下是一些代码,从cellForRowAtIndexPath

开始
static NSString *strCellIdentifier = @"CustomLeafletVideoCell";
CustomLeafletVideoTableViewCell *customCell = (CustomLeafletVideoTableViewCell *)[tableView dequeueReusableCellWithIdentifier:strCellIdentifier];

self.rightUtilityButton = [NSMutableArray new];

if (![[NSUserDefaults standardUserDefaults] boolForKey:@"Favourite"])
{
    [self.rightUtilityButton sw_addUtilityButtonWithColor:
     [UIColor colorWithRed:1.0f green:0.0f blue:0.0f alpha:1.0]
                                                 icon:[UIImage imageNamed:@"Favorites@2x.png"]];

}
else if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Favourite"])
{
    [self.rightUtilityButton sw_addUtilityButtonWithColor:
     [UIColor colorWithRed:1.0f green:0.0f blue:0.0f alpha:1.0]
                                                 icon:[UIImage imageNamed:@"Database@2x.png"]];


}

customCell.rightUtilityButtons = self.rightUtilityButton;
customCell.delegate = self;

当用户点击单元格中的图像时,此方法将触发:

- (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityButtonWithIndex:(NSInteger)index
{

    switch (index) {
        case 0:
        {

        self.selectedRowCollection = [[NSMutableDictionary alloc] init];


        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

        CustomLeafletVideoTableViewCell *cell = (CustomLeafletVideoTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];

        // We create a new NSString and assign it to the custom label's text (which is obtained from the cellForRow method)
        NSString *cellTitle = cell.customCellLabel.text;

        NSLog(@"The text is %@", cellTitle);


        NSManagedObjectContext *context = [self managedObjectContext];

        Favourites *favourites = [NSEntityDescription insertNewObjectForEntityForName:@"Favourites" inManagedObjectContext:context];
        favourites.title = cellTitle;

        NSError *error = nil;
        if (![context save:&error])
        {
            // Error
        }


        [cell hideUtilityButtonsAnimated:YES];


        [self.tableView reloadData];
    }
}

我正在核心数据中存储“标题”。

问题

当我滑动单元格并按下星形图像时,它不会加载指定区域中UIImageView的单元格。它不是因为我真的不明白该怎么做。

我理解答案表明我应该创建一个自定义类,虽然我理解其背后的理论,但我无法理解如何恰当地实现它。

我看过这个引用:Using BOOL objects in NSMutableArray to determine cell statuses在选择单元格时使用复选标记作为附件。这是有效的,但它在第一部分和第二部分的同一对应单元格上打勾。

我已经发现我可以从indexPath.rowindexPath.section获得确切的行号和部分编号,但我只是不确定如何处理这些信息。我总是可以向isFavourite模型添加BOOL Core Data,但我如何在cellForRowAtIndexPath?

中实际设置indexPath.row

总而言之,对于我所提出的250个赏金,我需要了解如何:

  • 使用图片和
  • 设置特定的indexPath.sectionUITableViewController
  • 保持这一点,以便每当我回到 self.isFavourite = @(!self.isFavourite.boolValue); 时,明星都在适当的单元格上

我在这里是个新手,所以如果你很乐意尽可能多地提供帮助,我真的很感激。

另外,我之后没有关于如何处理收藏夹的问题;这是有效的 - 当一个单元格被标记为收藏时,我只需要将图像放到单元格上。

任何指导都将不胜感激。

更新

这是我设置收藏夹的代码:

self.isFavourite

其中NSNumber是在此UITableViewController上创建的cellForRowAtIndexPath属性。

customCell.customCellLabel.text = [NSString stringWithFormat:@"%@",[self.availableLeaflets objectAtIndex:indexPath.row]]; if (self.isFavourite.boolValue) { customCell.accessoryType = UITableViewCellAccessoryCheckmark; } else { customCell.accessoryType = UITableViewCellAccessoryNone; }

self.availableLeaflets

此处的代码是设置UITableViewController的标题。这可以设置单元格上的复选标记,但问题是,当我回到此self.availableLeaflets时,复选标记没有保留在选定的单元格上。

此处,NSMutableArrayprepareForSegue,可以从之前的UITableViewController中的var indexDict = [String: [String]]() var array = ["At", "Ab", "Bs", "BE", "SD"] for val in self.array { //get the first letter let char = val.removeAtIndex(val.startIndex) var str = String(char).capitalizedString if let _ = Int(str) { str = "#" } //see if it's in the index array, if it isn't add it if (indexDict[str] == nil) { indexDict.updateValue([val], forKey: str) } else { indexDict.updateValue(indexDict[str]!.append("\(val)"), forKey: str) } } 进行填充和设置。

1 个答案:

答案 0 :(得分:2)

当用户点击一个单元格中的星号时,您的代码会将所有单元格标记为收藏,因为您只在UserDefaults中存储了一个键。

您必须单独存储每个单元格的收藏状态。每个细胞必须有自己最喜欢的细胞。布尔值。

<强>更新

这是一个关于如何在不使用Core Data的情况下实现您想要的实例。为清晰起见,我简化了示例:

  1. tableview显示单元格的标题。如果单元格是收藏夹,则会显示复选标记附件视图。
  2. 要标记单元格,只需选择它即可。 (我省略了整个按钮代码,保持示例简单)。如果您第二次从收藏夹中删除单元格
  3. 这是你要做的事情:

    #import "ViewController.h"
    #import <CoreData/CoreData.h>
    #import "CellData.h"
    #import "AppDelegate.h"
    
    @interface ViewController () <UITableViewDataSource, UITableViewDelegate>
    @property (nonatomic) UITableView *tableView;
    @property (nonatomic) NSMutableDictionary *favoritesDict;
    @property (nonatomic) NSInteger context;
    @property (nonatomic) NSString *language;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // setup the table view
        self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
        [self.view addSubview:self.tableView];
    
        // setup the favorites dictionary in user defaults (if it does not exist)
        if ([[NSUserDefaults standardUserDefaults] valueForKey:@"favoritesDict"] == nil) {
            [[NSUserDefaults standardUserDefaults] setObject:@{} forKey:@"favoritesDict"];
        }
    
        // set the language of your current table view
        self.language = @"en";
    
        // load favorites from user defaults
        self.favoritesDict = [[[NSUserDefaults standardUserDefaults] valueForKey:@"favoritesDict"] mutableCopy];
    
    }
    
    // this method changes the favorite state of the cell at a given index path
    - (void)toggleFavoriteStateForCellAtIndexPath:(NSIndexPath *)indexPath {
    
        // toggle the favorite state of the cell
        NSString *key = [NSString stringWithFormat:@"%@_%ld_%ld", self.language, (long)indexPath.section, (long)indexPath.row];
        if (self.favoritesDict[key] == nil) {
            self.favoritesDict[key] = @(1);
        } else {
            [self.favoritesDict removeObjectForKey:key];
        }
    
        // save the change
        [[NSUserDefaults standardUserDefaults] setObject:self.favoritesDict forKey:@"favoritesDict"];
    
        // reload the cell
        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
    
    #pragma mark - UITableViewDataSource
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 2;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 10;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    
        // add the text to your cell
    
        // set up favorite state
        NSString *key = [NSString stringWithFormat:@"%@_%ld_%ld", self.language, (long)indexPath.section, (long)indexPath.row];
        if (self.favoritesDict[key]) {
            // show the favorite image
            cell.accessoryType = UITableViewCellAccessoryCheckmark; // for this example: show checkmark
        } else {
            // hide the favorite image
            cell.accessoryType = UITableViewCellAccessoryNone; // for this example: hide checkmark
        }
    
        return cell;
    }
    
    #pragma mark - UITableViewDelegate
    
    // toggle the favorite state of the cell when the user selects it
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        [self toggleFavoriteStateForCellAtIndexPath:indexPath];
    }
    
    @end
    

    此示例适用于具有多个部分的表。它使用NSDictionary并将受欢迎的单元格存储在具有以下语法LANGUAGE_SECTION_ROW的键中。要检查单元格是否标记为收藏夹,只需检查字典中是否存在相关键的对象。该密钥的实际值无关紧要。你只需要检查密钥。

    请确保在viewDidLoad中设置语言字符串。