gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:37:13 25 4
gpt4 key购买 nike

我有一个简单的 UITableViewController,在 UITableView 中有一些静态单元格。 UITableView 正在由另一个 UITableViewControllerprepareForSegue 填充。此 UITableViewController 有两个部分,其中第一部分是字符串的 NSMutableArray,第二部分是包含 .txt 文件的 NSMutableArray用字符串。有些“语言”只有一个部分,而另一些则有两个部分。 UITableView 没有其他特别之处。配合使用教程:http://www.appcoda.com/swipeable-uitableviewcell-tutorial/#disqus_thread ,我设法在单元格上实现了自定义手势,因此我可以滑动单元格以将其标记为收藏。我必须使用该教程中的代码将默认行为从删除更改为星标,如下面的屏幕截图所示:

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 中实际设置它?

总而言之,对于我在这个问题上提出的 250 赏金,我需要了解如何:

  • 用图片设置具体的indexPath.rowindexPath.section
  • 维护它,以便每次我回到这个 UITableViewController 时,星号都在适当的单元格上

我是这里的新手,所以如果您愿意提供尽可能多的信息,我将不胜感激。

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

任何指导将不胜感激。

更新

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

        self.isFavourite = @(!self.isFavourite.boolValue);

其中 self.isFavourite 是在此 UITableViewController 上创建的 NSNumber 属性。

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 是一个 NSMutableArray,它从前面的 UITableViewController 中的 prepareForSegue 填充和设置>。

最佳答案

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

您必须分别为每个单元格存储最喜欢的状态。每个单元格必须有自己的“最喜欢的” bool 值。

更新:

这是一个工作示例,说明如何在不使用 Core Data 的情况下实现你想要的。为清楚起见,我简化了示例:

  1. 表格 View 显示单元格的标题。如果单元格是收藏夹,它会显示复选标记附件 View 。
  2. 要标记一个单元格,您只需选择它。 (我省略了整个按钮代码以保持示例简单)。如果您第二次选择该单元格,它将从收藏夹中删除

这是你必须做的:

#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 的键中。要检查一个单元格是否被标记为最喜欢的,只需检查字典中是否有相关键的对象。该键的实际值无关紧要。您只需检查 key 。

只需确保在 viewDidLoad 中设置语言字符串即可。

关于ios - 事件发生时更改特定 UITableViewCell 的 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33420341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com