【问题标题】:Issue assigning action to UIButton in TableView Cell creation在 TableView 单元创建中向 UIButton 分配操作问题
【发布时间】:2015-01-13 22:20:21
【问题描述】:

我正在使用从服务器调用的数据动态填充TableView。我有 2 个主文件,一个用于新单元格,一个用于处理 TableView 内的单元格数量现在,当我将 [cell.button addTarget:self action:@selector(addFriend:) forControlEvents:UIControlEventTouchUpInside]; 分配给 cellForRowAtIndexPath 内的按钮时,我将输出记录到单击按钮,没有任何反应。

这是我正在做的事情:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  .......
  /* Setup button action */
        [cell.button addTarget:self action:@selector(addFriend:) forControlEvents:UIControlEventTouchUpInside];
}
- (IBAction)addFriend:(id)sender
{
    NSLog(@"Add friend.");
}

细胞创建:

HomePageTimelineCell *cell = (HomePageTimelineCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell = [[HomePageTimelineCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

建议?

更新:

这是我的cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%d",i);
    self.tableView.separatorColor = [UIColor clearColor];// Get rid of speration border color

    static NSString *CellIdentifier = @"homecell";
    HomePageTimelineCell *cell = (HomePageTimelineCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell = [[HomePageTimelineCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    [cell initTimelineCell];

    cell.backgroundColor = [UIColor clearColor];// Set the background color to the cell

    //<!-- Set background color
    if (indexPath.row % 2) {
        cell.contentView.backgroundColor = [self colorWithHexString:@"77d1af"];
        //<!-- Set background and text color for even cells
        [cell.button setTitleColor:[self colorWithHexString:@"7ddcb8"] forState:UIControlStateNormal];
        cell.button.backgroundColor = [self colorWithHexString:@"666666"];
    } else {
        cell.contentView.backgroundColor = [self colorWithHexString:@"7ddcb8"];
        //<!-- Set background and text color for even cells
        [cell.button setTitleColor:[self colorWithHexString:@"7ddcb8"] forState:UIControlStateNormal];
        cell.button.backgroundColor = [self colorWithHexString:@"ffffff"];
    }
    //<!-- if the indexRow row = 0, this is the clients username and address
    if(indexPath.row == 0)
    {
        NSArray *get = [[SSKeychain allAccounts] init];
        NSString *username = [get[0] objectForKey:@"acct"];
        //<!-- Get keyname of the address and than point to that keyname and get data
        NSString *KeyName = [[self.dataGrabed_dictionary allKeys] objectAtIndex: indexPath.row + 4];
        //<!-- create uppercase strings
        NSString *upperCaseAddress = [[self.dataGrabed_dictionary objectForKey:KeyName] uppercaseString];
        NSString *upperCaseUsername = [username uppercaseString];
        //<!-- Set associated strings
        cell.addressLabel.text = upperCaseAddress;
        cell.usernameLabel.text = upperCaseUsername;
    }
    //<!-- if the indexRow row = 1, this is the 2 cell and will show the most upcoming lawn schedule
    else if(indexPath.row == 1)
    {        //<!-- create uppercase strings
        NSString *upperCaseDay = [[self.dataGrabed_dictionary objectForKey:@"upcoming_day"] uppercaseString];
        //<!-- create uppercase strings
        NSString *upperCaseDate = [[self.dataGrabed_dictionary objectForKey:@"upcoming_date"] uppercaseString];

        cell.contentView.backgroundColor = [self colorWithHexString:@"666666"];
        cell.button.backgroundColor = [self colorWithHexString:@"7ddcb8"];
        cell.button.tag = indexPath.row;

        [cell.button setTitle:@"change" forState:UIControlStateNormal];
        [cell.button setTitleColor:[self colorWithHexString:@"666666"] forState:UIControlStateNormal];
        /* Setup button action */
        [cell.button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        cell.dayLabel.text = upperCaseDay;//<!-- Set the day
        cell.dateLabel.text = upperCaseDate;//<!-- Set the Date
        [cell.contentView addSubview:cell.button];
        [cell.contentView addSubview:cell.nextLabel];
        [cell.contentView addSubview:cell.dayLabel];
        [cell.contentView addSubview:cell.dateLabel];
    }
    else //<!-- Normal cell population
    {
        //<!-- Re edit labels positioning
        cell.dayLabel.frame = CGRectMake(9, 10, 200, 45);
        cell.dateLabel.frame = CGRectMake(9, 35, 300, 45);
        //<!-- Setup data called from server
        NSDictionary *innerClientData =[self.dataGrabed_dictionary objectForKey:@"scheduled_times"][i];
        NSString *innerClientDay =[self.dataGrabed_dictionary objectForKey:@"scheduled_times_day"][i];
        NSString *innerClientDate =[self.dataGrabed_dictionary objectForKey:@"scheduled_times_date"][i];
        //<!-- create uppercase strings
        NSString *upperCaseDay = [innerClientDay uppercaseString];
        //<!-- create uppercase strings
        NSString *upperCaseDate = [ innerClientDate uppercaseString];

        //<!-- Check to see if client paid
        if([[innerClientData objectForKey:@"client_paid"]  isEqual: @"0"])
        {
            NSString *amount = [innerClientData objectForKey:@"client_price"];
            NSString *pay = @"pay $";
            NSString * combined = [pay stringByAppendingString:amount];

            [cell.button setTitle:combined forState:UIControlStateNormal];
        }
        else if([[innerClientData objectForKey:@"client_paid"] isEqual: @"1"])
        {
            [cell.button setTitle:@"PAID" forState:UIControlStateNormal];
        }
        //[cell.button setTitleColor:[self colorWithHexString:@"666666"] forState:UIControlStateNormal];
        cell.button.tag = indexPath.row;
        /* Setup button action */
        [cell.button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        cell.dayLabel.text = upperCaseDay;//<!-- Set the day
        cell.dateLabel.text = upperCaseDate;//<!-- Set the Date
        [cell.contentView addSubview:cell.button];
        [cell.contentView addSubview:cell.dayLabel];
        [cell.contentView addSubview:cell.dateLabel];

        i++;

    }

    return cell;
}

这是我的HomePageTimelineCell 单元创建者:

#import "HomePageTimelineCell.h"
#import "HomePage.h"

@implementation HomePageTimelineCell
@synthesize cellContentView;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        cellContentView = [[UIView alloc] initWithFrame:CGRectMake(0, 5, 300, 85)];
        cellContentView.backgroundColor = [UIColor clearColor];


        _usernameLabel = [[UILabel alloc] initWithFrame:CGRectMake(9, 10, 300, 45)];
        _usernameLabel.font = [UIFont fontWithName:@"AppleSDGothicNeo-SemiBold" size:30.0];
        _usernameLabel.textColor = [UIColor whiteColor];

        _addressLabel = [[UILabel alloc] initWithFrame:CGRectMake(9, 40, 300, 45)];
        _addressLabel.font = [UIFont fontWithName:@"AppleSDGothicNeo-Light" size:20.0];
        _addressLabel.textColor = [UIColor whiteColor];
        _addressLabel.numberOfLines = 1;
        _addressLabel.lineBreakMode = NSLineBreakByTruncatingTail;

        _nextLabel = [[UILabel alloc] initWithFrame:CGRectMake(9, 0, 100, 45)];
        _nextLabel.font = [UIFont fontWithName:@"AppleSDGothicNeo-Thin" size:25.0];
        _nextLabel.textColor = [UIColor whiteColor];
        _nextLabel.text = @"NEXT";

        _dayLabel = [[UILabel alloc] initWithFrame:CGRectMake(9, 25, 200, 45)];
        _dayLabel.font = [UIFont fontWithName:@"AppleSDGothicNeo-SemiBold" size:35.0];
        _dayLabel.textColor = [UIColor whiteColor];

        _dateLabel = [[UILabel alloc] initWithFrame:CGRectMake(9, 50, 300, 45)];
        _dateLabel.font = [UIFont fontWithName:@"AppleSDGothicNeo-Thin" size:25.0];
        _dateLabel.textColor = [UIColor whiteColor];


        // IMPACT BUTTON STYLES 
        _button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        _button.layer.cornerRadius = 0.0f;
        _button.frame = CGRectMake(220, 20, 80, 45);



        /* ADD ALL THE CONTENT */
        [self addSubview:cellContentView];
        [cellContentView addSubview:_usernameLabel];
        [cellContentView addSubview:_addressLabel];



    }
    return self;
}

- (void) initTimelineCell
{
    cellContentView.layer.cornerRadius = 2;
    cellContentView.layer.masksToBounds = NO;

    configured = YES;
}

- (bool) configured
{
    return configured;
}

@end

【问题讨论】:

  • 在哪里创建 UIButton?您是否正在创建 UITableViewCell 的子类?你能粘贴那个代码吗?另外,我会尝试添加 didSelectRowAtIndexPath 方法来查看当您点击它时该行是否实际被选中而不是按钮。
  • @JoshGafni 我有didselectro...,它确实有效。
  • cell.button 是 IBOutlet 吗?
  • @christruman 不,我不这么认为。我给出定义去按钮目标的唯一地方是当我使用[cell.button addtarget...]
  • 好的,那么当您尝试添加目标时,该按钮可能不存在。如果按钮为 nil,则添加目标不会执行任何操作。您可以在 addTarget 行之前放置一个断点,然后 po cell.button 来查看它是否为 nil。

标签: ios objective-c uitableview uibutton


【解决方案1】:

假设您应该提供更多代码以清楚地了解正在发生的事情, 这不是最好的方法。

至少我希望你添加目标,只要单元格是 nil 并且你是 init 而不是越来越多的时间:)

但无论如何,在功能和设计上的正确做法,是在单元子类中实现按钮操作,然后通过委托返回 strong> 按钮触摸的单元格是。

我解释了各种方法here,最后一个是这个。

享受简洁的代码和优秀的设计 ;)

【讨论】:

  • {{需要引用}}关于所谓的“正确方法”
  • 更改为 best approach :) 好吗?
  • @Matteogobbi 我仍然不知道为什么它没有正常运行。检查更新
  • 在我的帖子中我说了另一件事:你必须在你的子类中配置按钮。所以按钮的目标是在子类中,从那里,通过委托模式,您将单元格(触摸按钮所在的位置)返回给委托(这将是您的 viewController)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
相关资源
最近更新 更多