Получение нажатия кнопки от пользовательской кнопки UITableViewCell - PullRequest
9 голосов
/ 10 марта 2012

У меня есть проект с пользовательским UITableViewCell (cell.h / .m / .xib), который имеет 2 метки (labelMain / labelSub) и две кнопки на нем (buttonName / buttonInfo), связанные с двумя действиями (showName / showInfo) ).

Что я хочу сделать, так это иметь возможность доступа к 2 действиям в главном viewcontroller моих проектов, чтобы при нажатии showName для textfield.text в viewcontroller (не в ячейке) было указано значение labelMain.text этой конкретной ячейки. .

Надеюсь, это имеет смысл. Моя проблема заключается в том, что если я запишу действие (showName) в ячейку.m, я не смогу получить доступ к текстовому полю из моего основного viewcontroller. С другой стороны, если я напишу действие в моем контроллере вида, как я узнаю, какая кнопка внутри какой ячейки была нажата?

Надеюсь, это имеет смысл ...

Ответы [ 5 ]

16 голосов
/ 10 марта 2012

Использование tag позволяет определить, какая кнопка в какой ячейке была нажата.

- (UITableViewCell *)tableView:(UITableView *)tableViews cellForRowAtIndexPath:(NSIndexPath *)indexPath {
      //init identifier
      if (cell ==nil)
       {
        //load nib file
       }

      buttonName.tag = indexPath.row;
      [buttonName addTarget:self action:@selector(showName:) forControlEvents:UIControlEventTouchUpInside];

      buttonInfo.tag = indexPath.row;
      [buttonInfo addTarget:self action:@selector(showInfo:) forControlEvents:UIControlEventTouchUpInside];

    }
}

-(void) showName:(UIButton*)button{
  int row = button.tag; //you know that which row button is tapped
}

-(void)showInfo:(UIButton*)button{
 int row = button.tag;//you know that which row button is tapped
}

---------------- РЕДАКТИРОВАТЬ -------------

Если вам нужно узнать, какая кнопка нажата на основе строки и раздела , вы можете попробовать это ниже.(в методе cellForRowAtIndexPath:)

int tag = (indexPath.row+1)+(indexPath.section*100);
buttonName.tag = tag;

Когда кнопка на

row = 5, section = 0, затем tag = 6.

row = 4,раздел = 3, затем тег = 305.

строка = 0, раздел = 11, затем тег = 1101.

ограничение , строка не может превышать 99.и не используйте положительный тег для другого просмотра.если вам нужно использовать тег, попробуйте отрицательный.(-1, -9, -100).

, поэтому отсюда вы можете рассчитать заднюю строку и секцию indexPath.используя это:

-(NSIndexPath*)getIndexPathFromTag:(NSInteger)tag{
    /* To get indexPath from textfeidl tag,
     TextField tag set = (indexPath.row +1) + (indexPath.section*100) */
    int row =0;
    int section =0;
    for (int i =100; i<tag; i=i+100) {
        section++;
    }
    row = tag - (section*100);
    row-=1;
    return  [NSIndexPath indexPathForRow:row inSection:section];

}

как использовать:

-(void)showInfo:(UIButton*)button{
     NSIndexPath *indexPath = [self getIndexPathFromTag:button.tag];
     int row = indexPath.row;
     int section = indexPath.section;
}
3 голосов
/ 10 марта 2012

Попробуйте это в файле viewController.m в cellForRowAtIndexPath метод

[[customCell showNameBtn] setTag:indexPath.row];
[[customCell showNameBtn] addTarget:self action:@selector(showName:) forControlEvents:UIControlEventTouchDown];

-(void) showName:(id)sender
{
// check here the sender tag and then perform you action what you want.
}
1 голос
/ 02 сентября 2015

Самое простое на мой взгляд решение:

В вашем CustomCell.h:

@property (nonatomic, copy) void (^buttonTapAction)(id sender);

В вашем CustomCell.m создайте IBAction и подключите его к вашему UIButton:

-(IBAction)cellButtonIsPressed:(id)sender{

    if (self.buttonTapAction) {
        self.buttonTapAction(sender);
    }
}

Затем в ViewController.m, где управляется ваш UITableView:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

        static NSString* cellIdentifier = @"customCell";
        CustomCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

        cell.buttonTapAction = ^(id sender){
                //Do what you want to do when the button inside THIS cell is clicked
            };
    }
1 голос
/ 10 июля 2015

Я предлагаю использовать для этого метод делегата (протокола).Вы будете иметь полный контроль над кнопкой, ячейкой и контроллером представления.И это очень просто

0 голосов
/ 10 марта 2012

Попробуйте создать кнопку динамически, с ее методами в одном контроллере. Сделайте это методом cellForRowAtIndexPath::

if (cell == nil) 
{ 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"WorkRequestedCC" owner:self options:nil];
    {
        for (id oneObject in nib) if ([oneObject isKindOfClass:[WorkRequestedCC class]])
            cell = (WorkRequestedCC *)oneObject;

    }
    UILabel *costLbl=[[UILabel alloc]initWithFrame:CGRectMake(792, 13, 10, 15)];
    costLbl.text=@"$";
    [costLbl setBackgroundColor:[UIColor clearColor]];
    UITextField *txtCost=[[UITextField alloc]initWithFrame:CGRectMake(805, 10, 94, 27)];
    txtCost.backgroundColor=[UIColor whiteColor];
    [txtCost setKeyboardType:UIKeyboardTypeNumberPad];
    txtCost.text=obj.expCost;

    [txtCost addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
    [cell.contentView addSubview:costLbl];
    [cell.contentView addSubview:txtCost];

    cell.lblDes.text=obj.expDes;

}

- (void)textChanged
{
     //your code here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...