Nano Hash - криптовалюты, майнинг, программирование

Получение нажатия кнопки с пользовательской кнопки UITableViewCell

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

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

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

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


  • Вы пытались передать слабую ссылку на метку в ячейку? т.е. cell.h: @property (nonatomic, assign) id textfield; затем напишите действие на ячейке.м.ч. 10.03.2012

Ответы:


1

Использование 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;

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

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

строка = 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;
}
10.03.2012
  • Где вы программно добавляете кнопку в TableViewController? 03.06.2018

  • 2

    Попробуйте это в файле 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.
    }
    
    10.03.2012

    3

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

    10.07.2015

    4

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

    В вашем 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
                };
        }
    
    02.09.2015

    5

    Попробуйте создать кнопку динамически, с ее методами в одном контроллере. Сделайте это в методе 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
    }
    
    10.03.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..