使用ARC时无法将方法从一个类调用到另一个类

时间:2013-09-27 09:21:07

标签: ios objective-c automatic-ref-counting

我知道如何将一个类的方法调用到另一个类。然而这一次它不适合我,它只是让我疯了。以下是我的代码

MenuPageCell.h

#import <UIKit/UIKit.h>
@class MenuPageViewController;
@interface MenuPageCell : UITableViewCell{
 NSInteger   m_cellIndex;
    MenuPageViewController   *m_parentViewController;
}
@property(nonatomic, assign) NSInteger      m_cellIndex;
@property(nonatomic, strong) MenuPageViewController   *m_parentViewController;
-(IBAction) addToCart;

@end

MenuPAgeCell.m

#import "MenuPageCell.h"
#import "MenuPageViewController.h"
@implementation MenuPageCell

@synthesize m_cellIndex;
@synthesize m_parentViewController;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}
-(IBAction) addToCart
{
    NSLog(@"Add To cart = %d",self.m_cellIndex);

    [m_parentViewController addItemToCart:self.m_cellIndex];
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

MenuPageViewController.m

-(void) addItemToCart:(NSInteger)aIndexItem
{
   NSLog(@"In Add to Cart method");
}

现在,此代码适用于非ARC Used项目,但它不适用于我。我知道应该是愚蠢的错误,但我无法弄明白。

谢谢&amp;问候

MAYUR

3 个答案:

答案 0 :(得分:3)

从单元格引用ViewController是一个设计缺陷,请考虑使用委托。但是,如果您确实需要ViewController属性,请将其设为weak而不是strong,因为目前您最终会使用保留周期。

@protocol MenuPageCellDelegate<NSObject>
- (void)addItemToCart:(NSInteger)aIndexItem;
@end

@interface MenuPageCell : UITableViewCell {
    NSInteger m_cellIndex;
}

@property(nonatomic, assign) NSInteger m_cellIndex;
@property(nonatomic, weak) id<MenuPageCellDelegate> delegate;

-(IBAction) addToCart;

@end

@implementation MenuPageCell
...
-(IBAction) addToCart
{
    NSLog(@"Add To cart = %d",self.m_cellIndex);

    if ([self.delegate responsToSelector:@selector(addItemToCart:)]) {
        [self.delegate addItemToCart:self.m_cellIndex];
    }
}
...
@end

MenuPageCellDelegate添加到MenuPageViewController的已实施协议列表中(如果它正在实施UITableViewDataSource协议),请tableView:cellForRowAtIndexPath:方法写cell.delegate = self;而不是{ {1}}

答案 1 :(得分:0)

m_parentViewController方法中初始化您的viewDidLoad

m_parentViewController = [[yourViewControllerName alloc] init];

然后致电

[m_parentViewController addItemToCart:self.m_cellIndex];

答案 2 :(得分:0)

在tableview的cellforrow方法中,

将一个选择器添加到单元格按钮,并将标记设置为等于索引路径。现在在选择器中,只需在sender.tag的帮助下区分不同的单元格。