objective-c методы доступа из пользовательской ячейки


Хорошо, это, возможно, вопрос новичка, но мне нужна помощь с ним.. У меня есть кое-какое видение.m и в нем пользовательская ячейка, которая определена в customCell.h и .м Так что в каком-то смысле.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.м я пробовал такие вещи, как [[self super] printStuff], но всегда получаю ошибку... Надеюсь, я правильно объяснил проблему

4   4   2013-05-16 14:25:06

4 ответа:

Если текстовое поле находится в пользовательской ячейке,его можно обработать... события в customCell.m тоже.

Если вы сделаете это, вы можете вызвать methode просто с [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 переменную в customCell.h как

@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;
}

Надеюсь, это поможет, Дайте мне знать в случае любого запроса.

Сделайте свой UITableView глобальный

И в -(BOOL)textFieldShouldReturn:(UITextField *)textField

Добавьте что-нибудь вроде:

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

Вам нужно использовать делегат. Пользовательский метод init ячейки будет принимать делегат someview. Для textFeild в CustomCell установите этот делегат. Что-то связывает это В 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 ];