天道酬勤,学无止境

How to achieve the effect of UITableViewCell selection by clicking a button in UITableViewCell?

I have a menuView in a list view controller. The menuView added on the UITableViewCell when a more button in the cell being taped.

It is easy to achieve with singleton. Here is code:

@implementation ProductsOperationMenu
static ProductsOperationMenu *_instance;
+ (instancetype)sharedInstance{

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] initWithFrame:CGRectZero];
    });
    return _instance;
}


- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        [self setup];
    }
    return self;
}

ZBMyProductsCell.m

@implementation ZBMyProductsCell

- (void)awakeFromNib
{
    [super awakeFromNib];
    _operationMenu = [[ProductsOperationMenu alloc] initWithFrame: CGRectZero];
}

- (IBAction)operationButtonClick:(UIButton *)sender {
    if ([self.contentView.subviews containsObject:_operationMenu]) {
        _operationMenu.hidden = ![_operationMenu isHidden];
    } else{
        [self.contentView addSubview:_operationMenu];
        _operationMenu.hidden = NO;
    }

    [_operationMenu mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.mas_equalTo(205);
        make.height.mas_equalTo(60);
        make.bottom.mas_equalTo(self.operationButton).offset(0);
        make.right.mas_equalTo(self.operationButton.mas_left).offset(-10);
    }];
}

I think it is singleton abuse. I want to improve the code.

Without singleton, the code and effect:

@implementation ProductsOperationMenu
- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        [self setup];
    }
    return self;
}

I think I have to handle the message sending between cells. When one cell's button being clicked, the menu view of others must hide.

I think it is quite similar to cell's selection. When one cell is being selected , the previous selected one's effect dismissed.

None or one

So how to achieve the effect of UITableViewCell selection by clicking a button in UITableViewCell?

评论

Make a global integer that contains the currently index of cell being clicked and when any button in cell is being clicked change the index and reload the tableView -- in cellForRow

 if(indexpath.row == index)
 {

    cell.menuView.isHidden = false
 }
 else
 {

    cell.menuView.isHidden = true
 }

Edit :

If you want to animate hide of menuView when another is selected then you must make the tableview global and access his visible cells and animate alpha of menuView with duration

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在uitableview的单元格中选中Uncheck按钮(Check Uncheck buttons in uitableview's cell)
    问题 我以前看过一些帖子,但是还没有得到答案,这就是为什么我试图以更有效的方式再次发布。 我如何在UITableView使用取消选中功能,如下图所示。 这是我想要的表,当我单击任何单元格的按钮时,该按钮的图像将更改,而不是在所有单元格上。 回答1 对于Check-Uncheck功能,仅buttonClicked:方法是不够的。 你将不得不也投入了状态cellForRowAtIndexPath:方法哪个按钮被选中或者未选择的原因cellForRowAtIndexPath:方法每次打电话的时候,你会滚动你UITableView和细胞就会刷新。 我看到了您先前的问题,您要添加两个动作两个按钮,这不是一个好方法,只需更改按钮的图像以进行check-uncheck 。 所以这是我为此做的- #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITableViewDelegate, UITableViewDataSource> { IBOutlet UITableView *tblView; NSMutableArray *arrayCheckUnchek; // Will handle which button is selected or which is unselected
  • 自定义 UITableViewCell 中的按钮操作会影响其他单元格(Button action in custom UITableViewCell affects other cells)
    问题 我有一个TablewView ,它的原型UITableViewCell有自己的类, 自定义 UITableViewCell 类 import UIKit class H_MissingPersonTableViewCell: UITableViewCell { @IBOutlet weak var strName: UILabel! @IBOutlet weak var imgPerson: UIImageView! @IBOutlet weak var Date1: UILabel! @IBOutlet weak var Date2: UILabel! @IBOutlet weak var MainView: UIView! @IBOutlet weak var btnGetUpdates: UIButton! @IBOutlet weak var btnComment: UIButton! @IBOutlet weak var btnReadMore: UIButton! override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super
  • iOS 7-如何从放置在UITableViewCell中的按钮获取indexPath(IOS 7 - How to get the indexPath from button placed in UITableViewCell)
    问题 我已经以编程方式创建了一个UITableView并将UISwitch添加到它的单元格附件视图中。 这是我在cellForRowAtIndexPath方法的单元格附件视图中的UISwitch代码。 UISwitch *accessorySwitch = [[UISwitch alloc]initWithFrame:CGRectZero]; [accessorySwitch setOn:NO animated:YES]; [accessorySwitch addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged]; cell.accessoryView = accessorySwitch; 这是单击按钮后调用的方法。 - (void)changeSwitch:(UISwitch *)sender{ UITableViewCell *cell = (UITableViewCell *)[sender superview]; NSIndexPath *indexPath = [self.filterTableView indexPathForCell:cell]; NSLog(@"%ld",(long)indexPath); ……………. My other
  • UIButton in UITableViewCell
    I have a UIButton with an image inside of a UITableViewCell. When the cell is being highlight, the button is also entering the highlighted state (i.e. a darker shade of the image), regardless of whether the user is clicking within the bounds of the button or not. I don't want this functionality - I only want the button to be highlighted when the button is clicked, not when the entire cell is being clicked. I've tried to set the image in the highlighted state to be the same as the normal image. This fixes the issue however it stops the button from changing color when it really is highlighted
  • 如何以编程方式增加iPhone中的UITableView单元格的高度?(How to programmatically increase UITableView cell's height in iPhone?)
    问题 我有一个单独的自定义UITableViewCell用于显示数据(这些数据来自服务器JSON响应)。在每个UITableViewCell我都有一个按钮作为更多信息。如果用户单击了更多按钮,我想以编程方式添加UILabel以显示来自服务器的其他信息。但是最初我设置了UITableViewCell高度,所以在单击“阅读更多”按钮后,我无法看到其他信息UILabel .. 这是屏幕截图: 这是我所需的屏幕: 这是我使用的以下编码: -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { int height1; if(readMore){ height1=200; NSLog(@"Clicked"); } else{ height1=100; NSLog(@"Not clicked"); } return height1; // Normal height } -(NSInteger) tableView:(UITableView *)table numberOfRowsInSection
  • Android控件与布局——基础控件RadioButton
    今天,我们的主题是基础控件RadioButton。在开始之前,我们还是以官方文档为开端来开始我们的讲解,下面是Android文档中对RadioButton的简介:看过上一篇文章的应该可以了解到,这个和我们的CheckBox是十分类似的,不同的点在于,这个控件可以由非选中状态通过点击事件转为选中状态,但是不能通过点击实现逆向的状态转换,一个默认样式RadioButton控件的非选中和选中状态如下:其组成和CheckBox一样,我们同样可以分别对其中的字体和Button进行设置,实现达到和CheckBox一样的效果。在上面我们在简介中得知,这个控件能通过点击事件实现的效果如下(不能逆向改变状态):接下来,我们对其基本属性进行设置,改变一下它的样式:下面我们就结合一个小例子来实际的应用一下,这个小例子就是实现多项单选功能,运行的效果如下:布局文件与控制逻辑如下:package aoto.com.commonwidgetandlayout.basic_widget.radioButton; import android.graphics.Color; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget
  • 如何创建具有透明背景的UITableViewCell(How to create a UITableViewCell with a transparent background)
    问题 我正在尝试将UITableViewCell的背景色设置为透明。 但是似乎没有任何作用。 我在tableViewCell内有一些图像/按钮,我想使白色的grouptableview背景消失,以使图像和按钮具有“浮动”效果(好像它们不在tableview )。 知道如何实现吗? 回答1 如果其他两个选项均无效,请尝试以下操作 UIView *backView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; backView.backgroundColor = [UIColor clearColor]; cell.backgroundView = backView; 回答2 实际上,这是在UITableViewCell的文档中回答的。 因此,尽管您必须在控件上设置透明性,但必须根据以下设置实际的单元格背景颜色。 “注意:如果要更改单元格的背景色(通过通过UIView声明的backgroundColor属性设置单元格的背景色),则必须在委托的tableView:willDisplayCell:forRowAtIndexPath:方法中执行此操作,而不是在数据源的tableView:cellForRowAtIndexPath:更改组样式表视图中单元格的背景色在iOS 3.0中具有与以前版本的操作系统不同的效果
  • iPhone-如何确定自定义UITableViewCell中的哪个按钮被按下(iPhone - How to determine in which cell a button was pressed in a custom UITableViewCell)
    问题 我目前有一个UITableView,其中装有一个位于单独笔尖中的自定义UITableViewCell。 在单元格中,有两个按钮连接到自定义单元格类中的操作。 当我单击一个按钮时,可以调用适当的方法,但是我需要知道按钮被按下的那一行。每个按钮的tag属性都为0。我不需要知道整个单元格的时间被选中,只是在按下特定按钮时,所以我需要知道它在哪一行,以便可以更新适当的对象。 回答1 更简单的解决方案是使用(id)sender定义按钮回调,并使用它来挖掘表行索引。 这里是一些示例代码: - (IBAction)buttonWasPressed:(id)sender { NSIndexPath *indexPath = [self.myTableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]]; NSUInteger row = indexPath.row; // Do something with row index } 您最有可能使用了相同的行索引来创建/填充单元格,因此识别按钮现在应该执行的操作很简单。 无需使用标签并尝试使其保持秩序! 澄清:如果您当前正在使用-(IBAction)buttonWasPressed; 只需将其重新定义为-(IBAction
  • UITableViewCell单击扩展(UITableViewCell expand on click)
    问题 可以说我们有一个自定义的UITableViewCell 因此,每当我单击单元格上的自定义按钮时,它都应扩展到一定程度(您可以说40多个高度...),当我再次单击相同的自定义按钮时,它应折叠到以前的高度。 开发人员请指导我..我怎样才能完成这项任务 回答1 实现heightForRowAtIndexPath以计算正确的高度。 然后在按钮的代码中,使用beginUpdates和endUpdates强制表重新评估每个单元格的高度: [self.tableView beginUpdates]; [self.tableView endUpdates]; 将使用heightForRowAtIndexPath自动计算对表格视图单元格高度的更改,并且这些更改也将显示为动画。 实际上,除了在单元格上执行此操作的按钮之外,您甚至可以只是在didSelectRowAtIndexPath选择单元格来执行此操作。 回答2 考虑到它是完全正确的,在这里我不会说什么与已接受的答案相矛盾。 但是,我将更详细地说明如何实现此目的。 如果您不想通读所有内容,并且对在一个正在运行的项目中使用源代码更感兴趣,那么我已将示例项目上载到GitHub。 基本思想是在-tableView: heightForRowAtIndexPath:方法内部具有一个条件,该条件确定是否应扩展当前单元格。 这将通过在-tableView
  • iOS,如何找到 UITableView 的选定行?(iOS, How to find selected row Of UITableView?)
    问题 我试图找到选定的UITableViewCell如下: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } if ([indexPath row] == [tableView cellForRowAtIndexPath:indexPath.row]) // i want to place value of selected row to populate the buttons //([indexPath row] == 0) //(indexPath.row == ![self cellIsSelected
  • 如何在Swift中的UITableViewCell上添加带有单击事件的按钮?(How to add a button with click event on UITableViewCell in Swift?)
    问题 在我的主页中,我为UITableViewCell创建了一个xib文件。 我正在从该xib文件加载单元格,并且工作正常。 在单元格内部,我有一些标签和按钮。 我的目标是通过单击单元格上的按钮来更改标签。 我的代码如下 import UIKit class SepetCell: UITableViewCell{ @IBOutlet var barcode: UILabel! @IBOutlet var name: UILabel! @IBOutlet var fav: UIButton! @IBOutlet var strep: UIStepper! @IBOutlet var times: UILabel! @IBAction func favoriteClicked(sender: UIButton) { println(sender.tag) println(times.text) SepetViewController().favorite(sender.tag) } override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super.setSelected
  • 我该如何区分UITableViewCell的哪一部分已被单击(how can I distinguish which part of UITableViewCell has been clicked)
    问题 我创建了一个UITableView一个自定义UITableViewCell 。 我的单元格在左侧包括一个UIImageView ,在右侧包括UITextView 。 在UITableViewController内部,我在表视图cellForRowAtIndexPath设置了图像和文本。 一切都很好,但是现在我需要实现didSelectRowAtIndex并且需要区分是否单击了单元格的UIImageView或UITextView 。 假设图片点击代表删除操作,其余的代表单元格编辑操作。 回答1 可以将手势识别器添加到表格视图并确定从用户触摸的位置选择了哪个单元,然后确定用户是否触摸了图像或单元,而不是将手势识别器添加到每个单独的单元中。 首先,请确保您的控制器采用UIGestureRecognizerDelegate协议。 @interface MyTableViewController() <UIGestureRecognizerDelegate> @end 然后,在加载视图时,将UIGestureRecognizer添加到UITableView 。 - (void)viewDidLoad { [super viewDidLoad]; UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]
  • 如何通过按下 iPhone 中的按钮将行/单元格动态添加到 UITableView(How to add row/cells dynamically to an UITableView by pressing a button in iPhone)
    问题 最初我有一个只有一个添加按钮的表格视图。 当用户按下此按钮时,我需要增加单元格计数并按如下方式添加单元格 如何编写行数以及如何通过单击添加按钮添加新行 //行数 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return **????** ; } // 单元格/行上的内容 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ?????? } // ### 添加新行.. ### -(IBAction)myAction:(id)sender { ???????? ; } 提前致谢... 回答1 在您的应用程序中,当您在 btn 中执行操作时,您必须向 Array 添加值。 例如,在您的 tableview 中,您在 cell.textLABEL.text 中显示 NSString。 这些字符串在 NSMutableArray 中。 现在当 buttonAction 被调用时 在myAction { NSString *newString =@"NEW CELL"; [tableArray
  • How to add a button with click event on UITableViewCell in Swift?
    In my main page, I created a xib file for UITableViewCell. I'm loading the cell from that xib file and its working fine. Inside of the cell I have some labels and buttons. I'm aiming to change the label by clicking to the button on the cell. My Code likes below import UIKit class SepetCell: UITableViewCell{ @IBOutlet var barcode: UILabel! @IBOutlet var name: UILabel! @IBOutlet var fav: UIButton! @IBOutlet var strep: UIStepper! @IBOutlet var times: UILabel! @IBAction func favoriteClicked(sender: UIButton) { println(sender.tag) println(times.text) SepetViewController().favorite(sender.tag) }
  • UITableViewCell: How to prevent blue selection background w/o borking isSelected property?
    I have a custom UITableViewCell subclass. I have set the contentView of my cell subclass to a custom UIView class in which i am overriding -drawRect: and doing all of the drawing there. Also, I am setting cell.contentView.opaque = NO in order to achieve transparency in certain areas of the cell (unfortunately, a backgroud image behind the table must show thru each cell in certain parts to achieve a stylistic effect. i know this is a performance hit. it must be so). Problem: I still see the default pretty blue gradient background being drawn behind my cell (in the transparent areas) when it is
  • UITableViewCell 内的 UIButton(UIButton inside UITableViewCell)
    问题 我在 myCustomCell 类中有 2 个 UIButton,它是 UITableViewCell 的子类。 黑色 Outline 是由“ cellForRowAtIndex ”返回的单元格(UITableViewCell *)。 此单元格包含“ myCustomCell ”作为子视图。 ' myCustomCell ' 有两个 UIButtons 和以下属性: backgroundcolor = clearColor opaque = NO 单击单元格中除两个红色框(UI 按钮)之外的任何位置时,我希望触发“ didSelectRowAtIndexPath ”。 但是如果用户点击 UIButton,则只需要触发目标的选择器,而不是 'didSelectRowAtIndexPath'。 我怎样才能做到这一点? 回答1 如果您按照上面提到的方式构建单元格: myCustomCell代表单元格内的一个子视图,它内部有两个按钮,每个按钮都有动作,这应该如下工作; 当您单击按钮时, didSelectRowAtIndexPath将不起作用并且该按钮将处理触摸事件,因为触摸层次结构将被按钮即第一个动作观察到,并且不会继续到 didSelectRowAtIndexPath 并且当您在除按钮之外的每个位置进行 Tab 时didSelectRowAtIndexPath将处理触摸
  • 重用单元格效果不佳 - TableView(Reusing cell doesn't work well - TableView)
    问题 我的手机按钮有问题。 在我的 tableView 中,每一行都由:一个图像、一些标签和一个按钮组成。 该按钮有一个复选标记图像。 单击它时,按钮的图像会发生变化。 问题是另一个按钮的图像也会无缘无故地改变。 发生这个错误是因为我的细胞被重复使用了。 我曾尝试在 TableViewCell 中使用prepareForReuse方法,但没有任何反应。 我也试过selectedRowAt但我没有任何结果。 请帮我。 图 1: 图 2: 这是我的custom Cell:函数custom Cell: override func prepareForReuse() { if checkStr == "uncheck"{ self.checkBook.setImage(uncheck, for: .normal) } else if checkStr == "check"{ self.checkBook.setImage(check, for: .normal) } } func isPressed(){ let uncheck = UIImage(named:"uncheck") let check = UIImage(named: "check") if self.checkBook.currentImage == uncheck{ checkStr == "check" } else
  • 如何在IOS的uitableview中使用可重用单元(How to use Reusable Cells in uitableview for IOS)
    问题 好的。 我似乎无法对表视图的工作方式有深刻的了解。 有人可以告诉我,尤其是在滚动时,如何在表格视图中重用单元格吗? 我对此的主要痛点之一是,当我在一个单元格中创建动作时,滚动时会影响其他单元格。 我尝试使用数组作为模型的后端,但是仍然得到了在不应该更改的情况下会发生变化的单元格。 很难弄清楚的是为什么当数组中的模型不更改时它们也会更改。 一个简单的例子: 表格视图单元格带有“赞”按钮。 当我单击其中一个单元格中的按钮时,按钮文本更改为“不喜欢”(到目前为止非常好)。 但是当我向下滚动时,即使我没有选择它们,其他单元格也会显示“不喜欢”。 当我向上滚动时,我最初选择的单元格又发生了变化,新的单元格也发生了变化。 我似乎无法弄清楚。 如果您可以向我展示一个有效的示例源代码,那就太好了!!! 谢谢! - (void)viewDidLoad { [super viewDidLoad]; likeState = [[NSMutableArray alloc]init]; int i =0; for (i=0; i<20; i++) { [likeState addObject:[NSNumber numberWithInt:0]]; } } - (UITableViewCell *)tableView:(UITableView *)tableView
  • 单击按钮如何滑动单元格(How cell swipe on clicking a button)
    问题 我想在点击按钮时滑动单元格。 我成功刷了一个单元格。 但我想在单元格上滑动按钮。 我的代码是 - (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *simpleTableIdentifier = @"SimpleCell"; SimpleCell *cell = (SimpleCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleCell" owner:self options:nil]; cell = [nib objectAtIndex:0]; } SimpleCell *cekks=[[SimpleCell alloc]init]; cekks.scrollButton.alpha =0.0; NSString *titleString; UIButton *sender = [[UIButton alloc]init]; //
  • didSelectRowAtIndexPath 不会被调用到 cellForRowAtIndex 的 UIButton(didSelectRowAtIndexPath is not invoked to UIButton of cellForRowAtIndex)
    问题 我知道这里有很多关于这个问题的重复,但我的要求是我在一个单元格上添加了 2 个 UIButtons,两个按钮将打开两个不同的视图。 如果我将属性 userInteractionEnabled 设置为 YES,那么它不会从下面的代码中从 didSelectRowAtIndexPath 中提取“finalID”。 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if(tableView == self.tableViewProject){ static NSString *cellId = @"attachmentCellId"; attachmentCell *cell = (attachmentCell *)[self.tableViewProject dequeueReusableCellWithIdentifier:cellId]; if(!cell) { if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"attachmentCell"