gpt4 book ai didi

ios - 如何使单元格中的 UIButton 在被点击后立即保留特定状态?

转载 作者:行者123 更新时间:2023-11-29 03:00:55 26 4
gpt4 key购买 nike

所以我在 UICollectionView 中有一个项目列表,并且有一个 UIButton,它是默认的并且选择了 UIImage 设置为一颗浅灰色的心和一颗黑色的心。

我的目标是允许用户将项目添加到收藏夹列表中。我在数据库中添加了一个名为“favourite”的列,它是 boolean 类型。

客户在商品的单元格中敲击心脏。触发一个方法,该方法使用作为 UIButton 的 titleLabel 传递的项目的对象 ID 从数据库中获取项目并将收藏夹列的 bool 值更新为“True”。

收藏按钮的方法:

- (void)addFavouriteButtonTapped:(UIButton *)sender
{
NSLog(@"add to favourites button tapped %@", [[sender titleLabel] text]);

// Set data base favaourite status to 1 (yes)
PFQuery *query = [PFQuery queryWithClassName:@"Garments"];
[query getObjectInBackgroundWithId:[[sender titleLabel] text] block:^(PFObject *object, NSError *error) {
object[@"favourite"] = @YES;
[object saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (!error) {
[[[UIAlertView alloc] initWithTitle:@"Add Favouite"
message:@"Item successfully added to favourites"
delegate:_thisController
cancelButtonTitle:@"Ok"
otherButtonTitles: nil] show];
} else {
NSLog(@"Something went wrong");
}
}];
}];
}

然后在我的 cellForItemAtIndexPath 中,我有一个 if 语句来设置 UIButton 的选定状态。

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{

NSLog(@"cellForItemAtIndexPath");
// other cell info here deleted to make things clearer

_addFavouriteButton = [cell addFavouriteButton];


// if database favourites status is equal to one then set highlighted to (yes)
if ([object valueForKey:@"favourite"] == [NSNumber numberWithBool:YES]) {
[_addFavouriteButton setSelected:YES];
NSLog(@"SETTING SELECTED");
} else if ([object valueForKey:@"favourite"] == [NSNumber numberWithBool:NO]) {
[_addFavouriteButton setSelected:NO];
}

[[_addFavouriteButton titleLabel] setText:[object objectId]];

[_addFavouriteButton addTarget:_thisController action:@selector(addFavouriteButtonTapped:) forControlEvents:UIControlEventTouchUpInside];

return cell;
}

现在,当我离开 View 时,一切都被破坏了,然后再次返回 View 时,黑心出现在我选择最喜欢的地方。这可以。我遇到的问题是,当我实际选择要添加为最爱的项目时,心脏会更新并保持灰色,直到我离开 UICollectionView 并返回。

我已经在 addFavouriteButtonTapped: 方法的主队列中尝试了 reloadData我也试过只重新加载单元格。

这些都不起作用。

我可以将 UIButton 的状态设置为选中,但是当我滚动时,选择不会保持位置并移动到其他单元格 UIButton 并离开单元格使用我实际选择的按钮。解决这个问题的唯一方法是保留少数,这样我们就有了一个新的 UICollectionView,它使用我数据库中的 if 语句来确定是否选择了一个单元格。

**My custom cell:**

@interface VAGGarmentCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet PFImageView *imageView;
@property (weak, nonatomic) IBOutlet UIButton *addFavouriteButton;

@property (weak, nonatomic) IBOutlet UITextView *title;
@property (weak, nonatomic) IBOutlet UILabel *price;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;

@end

问题:

我已经完成了大部分需要完成的工作,以后可以在构建列出客户收藏夹列表中的项目的页面时使用收藏夹列。但是,如何在点击按钮并成功更新后立即刷新 UICollectionView 以显示 UIButton 的选定状态?

最佳答案

确保您也将 sender(即按下的按钮)也设置为选中状态,或者在更新模型后重新加载 Collection View 一次。

更新:此答案已在聊天讨论后编辑和更新。

您的 View Controller 中的_addFavouriteButton 不需要iVar(或@property),按钮变量应该只是是 collectionView:cellForItemAtIndexPath:object: 方法范围内的局部变量 - 让我们首先修复该方法

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{
NSLog(@"cellForItemAtIndexPath");
// other cell info here deleted to make things clearer

// Create a local variable for your button - this saves a bit of typing in the rest
// of the method. You can also use dot notation as its a property
UIButton *favouriteButton = cell.addFavouriteButton;

BOOL objectFavourited = [object[@"favourite"] boolValue];
NSLog(@"Setting selected? %@", objectFavourited ? @"YES" : @"NO");
favouriteButton.selected = objectFavourited;

// You should set the title directly on the button (as per the docs -
// https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html#//apple_ref/occ/instp/UIButton/titleLabel),
// you shouldn't touch titleLabel except for styling

// However you only used the title for seeing which object the favourite button tap was for,
// so I've commented it out
// [favouriteButton setTitle:[object objectId] forState:UIControlStateNormal];

[favouriteButton addTarget:_thisController action:@selector(addFavouriteButtonTapped:) forControlEvents:UIControlEventTouchUpInside];

return cell;
}

现在是按钮目标方法。在这里你应该做以下事情:更新你的模型,改变按钮状态然后保存模型。如果模型成功保存,您的用户是否关心 - 不,不是真的!但是,如果保存失败,则用户需要知道,并且按钮和模型需要恢复到之前的状态。
我很确定如果保存失败,对象将处于与您尝试保存之前相同的状态 - favourite 属性设置为 YES。即使没有,将其设置回 NO 也无所谓。

获取按下按钮的项目的 indexPath 的最佳方法是使用与 this answer 中的方法类似的方法。 .这是计算索引路径的完美方式,不需要可怕的标签!

现在我们有了项目的索引路径,您无需查询该特定对象 - 我们可以使用 objectAtIndexPath: 直接获取它。

- (void)addFavouriteButtonTapped:(UIButton *)button
{
// Method adapted for a collection view from the above answer
CGPoint hitPoint = [button convertPoint:CGPointZero toView:self.collectionView];
NSIndexPath *hitIndex = [self.collectionView indexPathForItemAtPoint:hitPoint];

// Now get the object for this index
PFObject *object = [self objectAtIndexPath:hitIndex];

NSLog(@"add to favourites button tapped %ld - %@", (long)hitIndex.item, [object objectId]);

// Now update the model
object[@"favourite"] = @YES;

// And the button state
button.selected = YES;

// Now save the model to parse
[object saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {

if (!succeeded) {
// Reset the object back to its previous state
object[@"favourite"] = @NO;
// Reload the item to reflect the changes in the model
[self.collectionView reloadItemsAtIndexPaths:@[hitIndex]];

// Only bother the user if something bad happened
[[[UIAlertView alloc] initWithTitle:@"Oops!"
message:@"There was a problem please try again later"
delegate:self
cancelButtonTitle:@"Dismiss"
otherButtonTitles:nil] show];
}
}];
}

您可以重新加载 Collection View ,但是因为您已经用该方法更新了 View ,所以实际上没有任何必要。
但是,如果保存失败,您应该重新加载 Collection View ,因为按钮现在可能正在用于 Collection View 中的不同项目!

关于ios - 如何使单元格中的 UIButton 在被点击后立即保留特定状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23310449/

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