如何在点击UILabel(UITapGestureRecognizer)

时间:2017-12-08 12:40:17

标签: ios objective-c uitableview

我是目标c的新手,我对学习新技术非常感兴趣。

我在标签上有一个UITapGestureRecognizer。我正在使用2个标签,当我点击label1加载一些数据Tableview时,当我点击标签2时我想更改Tableview。

我没有找到符合我要求的任何解决方案。所以任何人都可以帮助我。

建议我在点击UILabel时如何更改TableView数据。

3 个答案:

答案 0 :(得分:1)

您可以按照以下方式执行此操作:

方式1:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
   ..
   ..
   ..
   // Here is your stuff for cell

   UILabel *lbl1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 80, 40)];
   [lbl1 setText:@"Label"];
   [lbl1 setUserInteractionEnabled:YES];
   [cell.contentView addSubview:lbl1];
   UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self    action:@selector(tapAction:)];
   tap.tag = [NSIndexPath row];
   [tap setNumberOfTapsRequired:1];
   [lbl addGestureRecognizer:tap];
   ... 
}

- (void)tapAction:(id)sender {
  switch(((UITapGestureRecognizer *)sender).view.tag) {
     case 0:
          // code for first TableView
          break;
     case 1:
         // code for second TableView

         break;
      ....
     }
}

方式2:

cellForRowAtIndexPath:方法中的

 UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]; 
tap.tag = [NSIndexPath row];
...

处理程序方法:

- (void)tapAction:(id)sender 
{
 switch(((UITapGestureRecognizer *)sender).tag) 
{
case 0:

NSLog(@"Tap action 1"); 

break; 
case 1:

NSLog(@"tap action 2");

break; 

..... }

答案 1 :(得分:0)

我假设你已经为tableview设置了datasource / delegate方法?然后在点击标签时更改这些方法中的必要内容并简单地调用

[self.tableView reloadData]

如果你对我所说的内容一无所知,那么我建议你先开始阅读一些关于tableviews的手册,然后才开始在SO上提问:)

答案 2 :(得分:0)

欢迎使用Stack Overflow!

这个答案应该有助于您清楚地了解情况,并让您更深入地了解如何使用表格视图和按钮来完成您所需的工作。

第一

Alladinian's发表评论,我强烈建议切换到UIButton对象,而不要使用UILabel个对象。这样,您的元素仍然可以显示您的文本(与标签一样)但您可以使用按钮类的内置目标功能。

- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;

SECOND

关于您的问题,再次,只需使用专为此情况设计的内置方法:

- (void)reloadData;

使用/设置UITableViewDelegateUITableViewDataSource可以使用此方法。像这样:这里是一个通用的UIViewController类的例子,它符合(可以正确使用)方便的UITableView代表。

头文件(SomeClassController.h)

// SomeClassController.h
#import <UIKit/UIKit.h>

@interface SomeClassController : UIViewController <UITableViewDelegate, UITableViewDataSource>

// do anything here. properties, methods, etc :)
@property (nonatomic, ...) UITableView *tableView;

@end

实施文件(SomeClassController.m)

// ...
- (void)viewDidLoad {

    self.tableView.delegate = self;
    self.tableView.dataSource = self;

}

现在,通过使用UIButton个对象,您可以设置一个方法来处理用户通过执行方法触摸屏幕。像这里:

- (void)viewDidLoad {

    ...

    [someButton addTarget:self action:@selector(didTouchButton:) forControlEvents:UIControlEventTouchUpInside];

}

- (void)didTouchButton:(__kindof UIButton *)button {

    // Here you received the users touch event on the button, do what you like!
    // As your question asked how to reload table data, simply add this line
    // after following my other steps.

    [self.tableView reloadData];    // Here the magic is done! 

    // This method will automatically reload the table view to display the 
    // most recently updated data you have given it. 

}

确保在重新加载之前更改数据,否则它可能不会以视觉内容方式更改。

快乐的编码!