Как пропустить изменение кнопки переключения через indexpath таблицы в iPhone? - PullRequest
0 голосов
/ 03 февраля 2012

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

Но проблема в том, что он не идентифицирует путь индекса, т. Е. Если в табличном представлении присутствуют 4 строки, и если я нажимаю на кнопку первой строки, его изображение должно измениться, но проблема в том, что выполняется действие 4-й строки, и его изображение изменяется, потому что он не получает правильный путь индекса изображения для изменения.

Это мой код для мобильного телефона:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
       NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", indexPath.section, indexPath.row];
    appDelegate = (StopSnoozeAppDelegate*)[[UIApplication sharedApplication]delegate];
    cell =(TAlarmCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[TAlarmCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        mimageButton = [UIButton buttonWithType:UIButtonTypeCustom];
        mimageButton.frame=CGRectMake(10, 20, 20, 20);   
        mimageButton.tag = 1;
        onButtonView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 30, 50)];
        onButtonView.tag = 2;
        onButtonView.image = [UIImage imageNamed:@"alarm_ON.png"];
        [mimageButton setImage:onButtonView.image forState:UIControlStateNormal];
        [cell.contentView addSubview:mimageButton];

        [mimageButton addTarget:self action:@selector(changeMapType::) forControlEvents:UIControlEventTouchUpInside];


}




     return cell;

}

Это мой код changemapType

-(void)changeMapType:(NSIndexPath*)path1:(UIButton*)sender{
appDelegate.changeimagetype =!appDelegate.changeimagetype;
if(appDelegate.changeimagetype == YES)
{
    onButtonView.image = [UIImage imageNamed:@"alarm_OF.png"];
    [mimageButton setImage:onButtonView.image forState:UIControlStateNormal];
    appDelegate.changeimagetype = YES;
}
else
{
    onButtonView.image = [UIImage imageNamed:@"alarm_ON.png"];
    [mimageButton setImage:onButtonView.image forState:UIControlStateNormal];
    appDelegate.changeimagetype = NO;

}


}

Ответы [ 5 ]

1 голос
/ 08 февраля 2012

Не нарушайте повторное использование ячеек табличного представления только для того, чтобы поместить разные теги на каждую кнопку.Если ваши ячейки совпадают, используйте один и тот же идентификатор повторного использования.

Вы можете узнать путь индекса отправителя, как этот, без необходимости возиться с тегами.Это также работает для многосекционных столов.

CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *hitIndex = [self.tableView indexPathForRowAtPoint:hitPoint];
0 голосов
/ 07 февраля 2012
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
                   NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", indexPath.row];
                appDelegate = (StopSnoozeAppDelegate*)[[UIApplication sharedApplication]delegate];
                cell =(TAlarmCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
                if (cell == nil) {
                    cell = [[[TAlarmCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

                   UIButton *mimageButton = [UIButton buttonWithType:UIButtonTypeCustom];
                    mimageButton.frame=CGRectMake(10, 20, 20, 20);   
                    mimageButton.tag = indexPath.row;
                    //onButtonView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 30, 50)];
                    //onButtonView.tag = 2;
                   // onButtonView.image = [UIImage imageNamed:@"alarm_ON.png"];
                    [mimageButton setImage:[UIImage imageNamed:@"alarm_ON.png"] forState:UIControlStateNormal];
                    mimageButton.selected = NO;
                    [cell.contentView addSubview:mimageButton];

                    [mimageButton addTarget:self action:@selector(changeMapType:) forControlEvents:UIControlEventTouchUpInside];
          }
    return cell;
    }




-(void)changeMapType:(UIButton*)sender{

    if(sender.selected == YES)
    {
            // onButtonView.image = [UIImage imageNamed:@"alarm_OF.png"];
        [sender setImage:[UIImage imageNamed:@"alarm_ON.png"] forState:UIControlStateNormal];
        sender.selected = NO;
    }
    else
    {
            //onButtonView.image = [UIImage imageNamed:@"alarm_ON.png"];
        [sender setImage:[UIImage imageNamed:@"alarm_OF.png"] forState:UIControlStateNormal];
        sender.selected = YES;

    }

}
0 голосов
/ 03 февраля 2012

Используйте yourTableView для получения индекса пути .. Попробуйте что-то вроде этого.

  - (void)buttonAction:(UIButton*)sender {

        UITableViewCell *cell = (UITableViewCell*)button.superview;
        NSIndexPath *indexPath = [yourTableView indexPathForCell:cell];
        NSLog(@"%d",indexPath.row)
    }
0 голосов
/ 03 февраля 2012

Я думаю, что следующий код может помочь вам ..


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

    UIView *myCheckbox = [[UIView alloc] init];
    UIButton *myBt1 = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 30, 30)];

    if([appDelegate.changeimagetype == YES"]){
       [myBt1 setBackgroundImage:[UIImage imageNamed:@"alarm_ON.png"] forState:UIControlStateNormal];       
    }
    else {
       [myBt1 setBackgroundImage:[UIImage imageNamed:@"alarm_OF.png"] forState:UIControlStateNormal];       
    }
    [myBt1 addTarget:self action:@selector(btcheckbox:) forControlEvents:UIControlEventTouchDown];
    [myBt1 setTag:indexPath.row];
    [myCheckbox addSubview:myBt1];

    [myBt1 release];
    [myCheckbox release];
    [cell addsubview:myview];
    return cell;    
}

-(void) btcheckbox:(id) sender
{
    UIButton *currentButton = (UIButton *) sender;

    if([[currentButton backgroundImageForState:UIControlStateNormal] isEqual:[UIImage imageNamed:@"alarm_OF.png"]])
    {
         appDelegate.changeimagetype = YES;
         [currentButton setBackgroundImage:[UIImage imageNamed:@"alarm_ON.png"] forState:UIControlStateNormal];

    }else if([[currentButton backgroundImageForState:UIControlStateNormal] isEqual:[UIImage imageNamed:@"alarm_ON.png"]])
    {
         appDelegate.changeimagetype = NO;
         [currentButton setBackgroundImage:[UIImage imageNamed:@"alarm_OF.png"] forState:UIControlStateNormal];
    }
}
0 голосов
/ 03 февраля 2012

Я не думаю, что вы можете иметь дополнительные аргументы в @selector, как это. Вам, возможно, придется подкласс UIButton и добавить свойство NSIndexPath (или даже просто int) и в -(void)changeMapType:(MyCustomButton*)sender получить доступ к этому свойству.

Также кажется, что вы даже не используете индексный путь в changeMapType, поэтому его также необходимо изменить.

РЕДАКТИРОВАТЬ: Вы пытаетесь изменить изображение кнопки? В этом случае вам вообще не нужен индексный путь или подкласс. Просто используйте [sender setImage:(UIImage *)image forState:(UIControlState)state].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...