我在UITableViewController
中有一些简单UITableView
个静态单元格。另一个UITableView
UITableViewController
正在填充prepareForSegue
。这个UITableViewController
有两个部分,第一部分是NSMutableArray
字符串,第二部分是NSMutableArray
,其中包含带字符串的.txt文件。有些“语言”只有一个部分,有些则有两部分。关于UITableView
没有别的想法。通过使用本教程:http://www.appcoda.com/swipeable-uitableviewcell-tutorial/#disqus_thread,我已设法在单元格上实现自定义手势,因此我可以滑动单元格以将其标记为收藏夹。我必须在该教程中使用代码来将默认行为从Delete更改为Star,如下面的屏幕截图所示:
一旦用户选择了星形图像,我希望在细胞本身上有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.row
和indexPath.section
获得确切的行号和部分编号,但我只是不确定如何处理这些信息。我总是可以向isFavourite
模型添加BOOL
Core Data
,但我如何在cellForRowAtIndexPath?
indexPath.row
总而言之,对于我所提出的250个赏金,我需要了解如何:
indexPath.section
和UITableViewController
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
时,复选标记没有保留在选定的单元格上。
此处,NSMutableArray
是prepareForSegue
,可以从之前的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)
}
}
进行填充和设置。
答案 0 :(得分:2)
当用户点击一个单元格中的星号时,您的代码会将所有单元格标记为收藏,因为您只在UserDefaults中存储了一个键。
您必须单独存储每个单元格的收藏状态。每个细胞必须有自己最喜欢的细胞。布尔值。
<强>更新强>
这是一个关于如何在不使用Core Data的情况下实现您想要的实例。为清晰起见,我简化了示例:
这是你要做的事情:
#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
中设置语言字符串。