如何从父类调用一个方法到它的子类?

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的关系。这就像您可能希望在控制器类的对象的上下文中发生某些事情时得到通知。您应该查看 delegationfunction 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

【讨论】:

以上是关于如何从父类调用一个方法到它的子类?的主要内容,如果未能解决你的问题,请参考以下文章

从父类方法调用子类方法

从父类对象调用子类方法

如何从父类调用子类函数?

如何在java中调用另一个类中子类里的一个变量?

为啥java的子类中必须调用父类的构造方法

如何从父类和子类的相同方法返回泛型类型