在自定义单元 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 刷新数据])