如何从父类调用一个方法到它的子类?
Posted
技术标签:
【中文标题】如何从父类调用一个方法到它的子类?【英文标题】:How to call a method from parent class to it's child class? 【发布时间】:2018-02-12 06:26:30 【问题描述】:在我的主视图控制器中有如下方法:
-(void)updateCartItem
我想在按钮操作方法下将其调用到uitableviewcell类中:
- (IBAction)Cart:(id)sender
[self updateCartItem];//like this you can call parent method which contain your VC.m file
请帮我提前谢谢...
【问题讨论】:
如何在你的 tableView 中为按钮添加操作?显示更多代码。 你的问题不清楚 动作在你的 UITableViewCell 类中吗? 您可以使用委托来执行此操作,也可以使用 codeBlock, 你想要完成的不是Parent-Child的关系。这就像您可能希望在控制器类的对象的上下文中发生某些事情时得到通知。您应该查看 delegation 或 function pointer。 【参考方案1】:您可以使用Delegate
或代码块来执行此操作,我将通过示例发布两种方式以供您澄清
委托方法
1 - 声明您的单元代表
我们的示例单元格将被称为 CustomTableViewCell
@protocol CustomCellDelegate
-(void)executeAction;
@end
并将您的委托添加到您的单元声明中,必须是弱的以避免保留循环
@property (weak) id<CustomCellDelegate> cellDelegate;
2 - 在您的 Cell Action 中执行您的委托操作
- (IBAction)Cart:(id)sender
[[self cellDelegate] executeAction];
3 - 让你的 UIViewController 实现你的 CustomCell 的 CustomCellDelegate
@interface ViewController () <UITableViewDataSource,UITableViewDelegate,CustomCellDelegate>
-(void)executeAction
[self updateCartItem];
4 - 将您的 UIViewController
设为 CustomCell 的 Delegate
调整您的 cellForRowAtIndexPath
方法
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpleTableIdentifier = @"CustomCell";
CustomTableViewCell *cell = (CustomTableViewCell*)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier forIndexPath:indexPath];
cell.cellDelegate = self;
return cell;
完整代码
CustomTableViewCell.h
#import <UIKit/UIKit.h>
@protocol CustomCellDelegate
-(void)executeAction;
@end
@interface CustomTableViewCell : UITableViewCell
@property (weak) id<CustomCellDelegate> cellDelegate;
@end
CustomTableViewCell.m
#import "CustomTableViewCell.h"
@implementation CustomTableViewCell
- (IBAction)Cart:(id)sender
[[self cellDelegate] executeAction];
@end
ViewController.m
#import "ViewController.h"
#import "CustomTableViewCell.h"
@interface ViewController () <UITableViewDataSource,UITableViewDelegate,CustomCellDelegate>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@end
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[_tableView setDelegate:self];
[_tableView setDataSource:self];
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 10;
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpleTableIdentifier = @"CustomCell";
CustomTableViewCell *cell = (CustomTableViewCell*)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier forIndexPath:indexPath];
cell.cellDelegate = self;
return cell;
-(void)updateCartItem
//Whatever you need to do here
-(void)executeAction
[self updateCartItem];
@end
代码块方法
1 - 在您的 Customcell 中声明您的 actionBlock
我们的示例单元格将被称为 CustomCell
@property void(^actionBlock)(void);
2 - 在您的 Cell Action 中执行您的操作块
- (IBAction)Cart:(id)sender
[self actionBlock];
3 - 设置您的单元格块操作,调整您的 cellForRowAtIndexPath 方法
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpleTableIdentifier = @"CustomCell";
CustomTableViewCell *cell = (CustomTableViewCell*)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier forIndexPath:indexPath];
__weak ViewController *weakSelf = self;
cell.actionBlock = ^
[weakSelf updateCartItem];
;
return cell;
完整代码
CustomTableViewCell.h
#import <UIKit/UIKit.h>
@interface CustomTableViewCell : UITableViewCell
@property void(^actionBlock)(void);
@end
CustomTableViewCell.m
#import "CustomTableViewCell.h"
@implementation CustomTableViewCell
- (IBAction)Cart:(id)sender
[self actionBlock];
@end
ViewController.m
#import "ViewController.h"
#import "CustomTableViewCell.h"
@interface ViewController () <UITableViewDataSource,UITableViewDelegate>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@end
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[_tableView setDelegate:self];
[_tableView setDataSource:self];
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 10;
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpleTableIdentifier = @"CustomCell";
CustomTableViewCell *cell = (CustomTableViewCell*)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier forIndexPath:indexPath];
__weak ViewController *weakSelf = self;
cell.actionBlock = ^
[weakSelf updateCartItem];
;
return cell;
-(void)updateCartItem
//Whatever you need to do here
@end
【讨论】:
以上是关于如何从父类调用一个方法到它的子类?的主要内容,如果未能解决你的问题,请参考以下文章