objective-c从自定义单元格访问方法

时间:2013-05-16 10:25:06

标签: iphone ios custom-cell

好吧,这可能是一个新手问题,但我需要帮助... 我有一个someview.m,其中有一个自定义单元格,它在customCell.h和.m中定义 所以在someview.m我有

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
    customCell *cell=[tableView dequeueReusableCellWithIdentifier:@"charCell"];
if (cell == nil || (![cell isKindOfClass: customCell.class]))
{
    cell=[[customCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"charCell"];
}
return cell;
}

我也有一个方法

-(void) printStuff
{
   NSLog(@"stuff");
}

现在自定义单元格工作正常,但我需要从

访问方法printStuff
- (BOOL)textFieldShouldReturn:(UITextField *)textField

位于customCell.m中 我尝过像[[self super] printStuff]这样的东西,但我总是收到错误... 我希望我能正确解释问题

4 个答案:

答案 0 :(得分:2)

如果textField位于您的自定义单元格中,您也可以处理customCell.m中的textField ...事件。

如果您这样做,可以使用

中的[self printStuff];简单地调用方法

- (BOOL)textFieldShouldReturn:(UITextField *)textField

//CustomCell.h
// ...
@interface CustomCell : UITableViewCell <UITextFieldDelegate>
{
    //...
}

-(void)printStuff;

@end

//CustomCell.m

//...

-(void)printStuff
{
    //...
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    //...
    [textField resignFirstResponder];

    [self printStuff];

    return YES;
}

或者如果printStuff方法在tableView类中,则可以声明协议

// CustomCell.h
@protocol CustomCellProtocol <NSObject>

-(void)printStuff:(NSString *)stuff;

@end

@interface CustomCell UITableViewCell <UITextFieldDelegate>

@property (nonatomic, assign)UIViewController<CustomCellProtocol> *parent;

// CustomCell.m
-(void)printStuff:(NSString *)stuff
{
    [parent printStuff:stuff];
}


// TableViewClass.h
...
@interface TableViewClass : UITableViewController<CustomCellProtocol>


// TableViewClass.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    customCell *cell=[tableView dequeueReusableCellWithIdentifier:@"charCell"];
    if (cell == nil || (![cell isKindOfClass: customCell.class]))
    {
        cell=[[customCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"charCell"];
        cell.parent = self; // or with a custom setter methode
    }
    return cell;
}

答案 1 :(得分:1)

customCell.h中取1个变量,如

@property (nonatomic,strong) UIView *parent; //Assuming someview is UIView, if it is UIViewController than change UIView to id

现在采用以下方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
    customCell *cell=[tableView dequeueReusableCellWithIdentifier:@"charCell"];
if (cell == nil || (![cell isKindOfClass: customCell.class]))
{
    cell=[[customCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"charCell"];
}
cell.parent = self;
return cell;
}

现在在

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [_parent printStuff]; //Call like this.
    return YES;
}

希望这有帮助,如果有任何疑问,请告诉我。

答案 2 :(得分:0)

您需要使用委托。自定义单元格init方法将采用someview的委托。对CustomCell中的textFeild设置此委托。东西链接这个 在CustomCell.h中有一个类变量

{
UIViewController *target;
}
 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier withtarget:(UIViewController *)_target;

在CustomCell.m

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier withtarget:(UIViewController *)_target
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code 
         target = _target;
}

//您现在可以使用此调用[target printStuff];

在someView.m cellForRow方法中,调用此init方法初始化单元格。

cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier withtarget:self ];

答案 3 :(得分:0)

制作UITableView全球

并在-(BOOL)textFieldShouldReturn:(UITextField *)textField

添加类似:

UITableViewCell *cell = [tableView cellForRowAtIndexPath:TheIndexPath];
[cell printStuff];