在自定义单元 iphone 中使用按钮传输变量

Posted

技术标签:

【中文标题】在自定义单元 iphone 中使用按钮传输变量【英文标题】:transfer variable with button in custom cell iphone 【发布时间】:2014-02-19 13:47:50 【问题描述】:

大家好!!我有一个问题,我不知道我该怎么办!! 我的目标是当我在 customcell 的按钮中单击时在另一个 ViewController 中传输一个 TableviewController 的变量。我使用自定义单元格,在自定义单元格中我有 2 个标签,一个按钮。 这是我的代码:

ArticlesCell.h

#import <UIKit/UIKit.h>
#import "CalculerViewController.h"
@interface ArticlesCell : UITableViewCell
@property (strong, nonatomic) IBOutlet UILabel *lblproduit;
@property (strong, nonatomic) IBOutlet UILabel *lblargent;
- (IBAction)btnincrement:(id)sender;
@property (strong, nonatomic) IBOutlet UIButton *btn;
@property (strong, nonatomic) NSString  *recupererlblproduit;
@end

一个tableviewcontroller:

ArticlesTableViewController.m

#import "ArticlesTableViewController.h"
#import "ArticlesCell.h"


@interface ArticlesTableViewController ()

@end

@implementation ArticlesTableViewController
@synthesize arrayargent1,arrayproduit1,arrayargent2,arrayproduit2,recuperationproduit;
- (id)initWithStyle:(UITableViewStyle)style

  self = [super initWithStyle:style];
  if (self) 
    // Custom initialization
  
  return self;


- (void)viewDidLoad

  [super viewDidLoad];

  recuperationproduit=nil;
  arrayproduit1 = [[NSMutableArray alloc] initWithObjects:@"Câble Ethernet UTP-CAT5 ",@"Câble Ethernet UTP-CAT6 ",@"Carte Réseau",@"Hub",@"Switch",@"Routeur",nil];
  arrayargent1 = [[NSMutableArray alloc] initWithObjects:@"10 000",@"15 000 ",@"250 000",@"300 000",@"500 000",@"550 000",nil];
  arrayproduit2 = [[NSMutableArray alloc] initWithObjects:@"Ram ",@"Disque Dur",@"Câble d'Alimentation",@"Carte Mere",@"Processeur",nil];
  arrayargent2 = [[NSMutableArray alloc] initWithObjects:@"100",@"15 000 ",@"250 000",@"300 000",@"500 000",@"550 000",nil];





- (void)didReceiveMemoryWarning

  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView


  return 2;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section


 if (section == 0)
    return self.arrayproduit1.count;
 if (section == 1)
    return self.arrayproduit2.count;
 return 0;



- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
  if (section == 0)
    return @"Matériels Réseaux";
  if (section == 1)
    return @"Matériels Ordinateur";
  return @"undefined";


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

  if ([segue.identifier isEqualToString:@"seguecalcule"])
  
    UINavigationController *navigationController = segue.destinationViewController;
    CalculerViewController *calculerViewController = [[navigationController viewControllers] objectAtIndex:0];
            calculerViewController.introlblproduit=recuperationproduit;
            calculerViewController.delegate = self;

  



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

 static NSString *CellIdentifier = @"CellArticle";



ArticlesCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) 
    cell = [[ArticlesCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];



if (indexPath.section == 0)
    cell.lblproduit.text = [arrayproduit1 objectAtIndex:indexPath.row];
    cell.lblargent.text = [self.arrayargent1 objectAtIndex:indexPath.row];


else if (indexPath.section == 1)
    cell.lblproduit.text = [self.arrayproduit2 objectAtIndex:indexPath.row];
    cell.lblargent.text = [self.arrayargent2 objectAtIndex:indexPath.row];

  

return cell;


- (void)calculerViewControllerDidCancel:(CalculerViewController *)cancel

 [self dismissViewControllerAnimated:YES completion:nil];




- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath





@end

计算器视图控制器.m

#import "CalculerViewController.h"
@interface CalculerViewController ()

@end

@implementation CalculerViewController
@synthesize display,lbltitre,delegate,introlblproduit;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) 
    // Custom initialization
  
  return self;


- (void)viewDidLoad

  [super viewDidLoad];
  lbltitre.text=introlblproduit;




- (void)didReceiveMemoryWarning

 [super didReceiveMemoryWarning];
 // Dispose of any resources that can be recreated.


- (IBAction)valider:(id)sender 


- (IBAction)cancel:(id)sender 

[self.delegate calculerViewControllerDidCancel:self];

@end

当我点击按钮时,我想转移我的自定义单元格的标签。 请帮帮我!!

【问题讨论】:

您只想将自定义单元格的标签值发送到另一个视图控制器。对吗? 是的,当我单击同一单元格中的按钮时!谢谢你的评论!!解决这个问题对我来说非常重要! 【参考方案1】:

最简单的答案是将每个单元格中的按钮直接连接到视图控制器中的相同方法,然后使用 sender 参数访问被点击的单元格。

类似这样的东西(未测试):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *CellIdentifier = @"CellArticle";

    ArticlesCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
       cell = [[ArticlesCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    

    // When the user taps the cell button, fire a method on the view controller
    [cell.btn addTarget:self action:@selector(cellButtonTapped:) forControlEvents:UIControlEventsTouchUpInside];

    ...


- (void) cellTapped:(id)sender

    ArticleCell *cell = sender.parent; // XXX: This is where it gets ugly!
    // Now send your cell content to your other view controller.

但正如您所见,这种方法变得非常难看,因为您必须了解单元格内的视图层次结构。

因此,更好的方法是使用委托模式:让 UITableViewCell 子类有一个委托,您可以将其连接到您的 UIViewController 实例。

在你的情况下,它看起来像这样:

// Forward declaration required because protocol references class
@protocol ArticlesCellDelegate;

@interface ArticlesCell : UITableViewCell
@property (strong, nonatomic) IBOutlet UILabel *lblproduit;
@property (strong, nonatomic) IBOutlet UILabel *lblargent;
- (IBAction)btnincrement:(id)sender;
@property (strong, nonatomic) IBOutlet UIButton *btn;
@property (strong, nonatomic) NSString  *recupererlblproduit;

// New delegate property
@property (strong, nonatomic) id<ArticleCellDelegate> delegate;

@end

@protocol ArticlesCellDelegate
  - (void) didTapButtonInArticleCell:(ArticleCell*)cell;
@end

然后在你的视图控制器中:

@interface ArticlesTableViewController () <ArticleCellDelegate>

@end

@implementation ArticlesTableViewController

...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *CellIdentifier = @"CellArticle";

    ArticlesCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
       cell = [[ArticlesCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    

    // Make the view controller the cell's delegate
    cell.delegate = self;
    ...


- (void) didTapButtonInArticleCell:(ArticleCell*)cell  

    // Now send your cell content to your other view controller.

您需要的另一件事是在您的文章单元格类中,您需要在点击按钮时处理委托。您的 btnIncrement: 方法可以做到这一点:

@implementation ArticleCell

...
- (IBAction)btnincrement:(id)sender;

    if( self.delegate )
        [self.delegate didTapButtonInArticleCell:self];

附带说明,如果我是你,我会尽可能多地将这些 UI 元素移出界面定义。接口部分正是它所说的:定义接口的地方。您通常希望将视图的内部工作封装在实现部分中,并让接口部分反映您希望使用它的方式。

【讨论】:

好的,谢谢!!我试着用你的回答解决我的问题,如果我阻止我会在这里发帖!!非常感谢!! 不客气。请注意,我没有测试过代码,所以其中可能有一些小细节。不过这种方法是正确的。 完美运行!!非常感谢你!!你解决了我的问题!!我很高兴继续我的项目!!谢谢你!! :D。我已经使用了您的第二个解决方案(代表) 很高兴听到它的工作:)。请您将此标记为您问题的已接受答案。谢谢!【参考方案2】:

我怀疑在您的 prepareForSegue 方法中,您的导航控制器的子视图控制器尚未创建,并且进入导航控制器并尝试操作它的根视图控制器无论如何都是不好的设计。

我建议让您的导航控制器成为 UINavigationController 的自定义子类。给它属性来保存你的值并在你的 prepareForSegue 中设置它们。

然后在您的 CalculerViewController 的 viewDidLoad 中,获取您的导航控制器,将其转换为您的自定义类,并从导航控制器中读取数据。

【讨论】:

感谢您的回答!!我不明白,我是 Objective-C 和 iphone 的新手!!你能发一个例子吗!! 我没有示例,这是您的应用程序所独有的。我不会为你编写代码。你不明白哪些部分?阅读那部分/那些部分。实验。如果您遇到困难,请发布更多问题。 如果我在导航控制器中使用按钮,我可以传输变量,我已经阅读了很多教程来做到这一点,但我的项目是自定义单元格中的按钮!单击同一单元格上的按钮时如何转移标签

以上是关于在自定义单元 iphone 中使用按钮传输变量的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何在自定义单元的动态数量上管理 UITextfield 委托方法

添加另一个部分时将编辑的文本保留在自定义单元格中([tableView 刷新数据])

如何在自定义单元格中同步选择文本视图的事件?

在自定义表格视图单元格按钮操作中导航到另一个 Viewcontroller

在自定义单元格 Swift 中保存 uibutton 状态

当在同一个单元格内单击按钮时,如何在自定义表格视图单元格内隐藏/显示特定视图