创建UITableView时,某些行永远不会有UIButtons

时间:2014-03-12 18:45:01

标签: ios objective-c uitableview uibutton

我有一个永远不会一致的UITableView。该表视图有2个部分。

我创建了2个UIButton,它们实际上是相同的图像,但一个是灰色,一个是红色。

当UITableView首次加载时,UITableView中的每一行都应该有灰色按钮,然后如果用户点击一个按钮,它就会切换到该按钮的红色版本。

出于某种原因,我在iPhone上使用此UITableView加载视图控制器时,大约有80%的时间,第一部分中的前两行将没有按钮。有点奇怪的是,如果我按下我的手指按钮应该是两件事情发生了:

  1. 附加到按钮的功能和xcode中控制台中的NSLog。
  2. 出现红色按钮。
  3. 所以就像灰色按钮在那里,它只是看不见。这不起作用,因为如果用户看到没有按钮的2行,他们会认为某些内容被破坏或者他们无法点击该行。

    另外,如果我滚动到UITableView的最底部,然后再向上滚动,那么隐形的灰色按钮就会像他们在那里一样神奇地出现。

    以下是创建我的UITableView所涉及的前3个方法实现:

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    
        return 2 ;
    
    }
    
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    
        if(section == 0)
    
            return [self.potentiaFriendsInParseFirstNamesArray count];
    
        if(section == 1)
    
            return [self.potentiaFriendsNotInParseFirstNamesArray count];
    
        else return 0;
    
    
    
    }
    
    
    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    
        if(section == 0)
            return @"Friends Using The App";
        if(section == 1)
            return @"Send to Contact";
    
        else return @"nil";
    
    }
    

    然后这是我的cellForRowAtIndexPath方法实现,它完成了创建UITableView的大部分工作,并且实际上为每一行创建了UIButton设置。 if else语句实际上有两组几乎相同的代码,唯一的区别是一个是表视图的第1部分,另一个是第2部分:

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    
    static NSString *cellIdentifier = @"SettingsCell";
    
    
    UITableViewCell  *cell = [self.tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    
    
    if (indexPath.section == 0) {
    
    
    
        NSString *firstNameForTableView = [self.potentiaFriendsInParseFirstNamesArray objectAtIndex:indexPath.row];
    
    
        PFUser *user = [self.allUsersInParse objectAtIndex:indexPath.row];
    
    
        UIImage *addUserButtonImage = [UIImage imageNamed:@"SliderThumb-Normal-g"];
        UIImage *addUserButtonImageHighlighted = [UIImage imageNamed:@"SliderThumb-Normal"];
    
    
        UIButton *addUserButton = [[UIButton alloc]init];
    
        addUserButton.frame = CGRectMake(237, -10, 64, 64);
    
    
        [addUserButton setImage:addUserButtonImage forState:UIControlStateNormal];
    
        [addUserButton setImage:addUserButtonImageHighlighted forState:UIControlStateHighlighted];
    
        [addUserButton setImage:addUserButtonImageHighlighted forState:UIControlStateSelected];
    
    
    
        [addUserButton addTarget:self action:@selector(handleTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];
    
    
    
        addUserButton.tag = indexPath.row;
    
    
        [cell.textLabel setText:firstNameForTableView];
    
        [cell.detailTextLabel setText:user.username];
    
        [cell.contentView addSubview:addUserButton];
    
    
    
    } else {
    
    
    
        NSString *firstNameForTableView2 = [self.potentiaFriendsNotInParseFirstNamesArray objectAtIndex:indexPath.row];
    
    
        NSString *userNameForTableView2 = [self.potentiaFriendsPhoneNumberArray objectAtIndex:indexPath.row];
    
    
    
        UIImage *addFriendButtonImage = [UIImage imageNamed:@"SliderThumb-Normal-G"];
        UIImage *addFriendButtonImageHighlighted = [UIImage imageNamed:@"SliderThumb-Normal"];
    
    
        UIButton *addFriendButton = [[UIButton alloc]init];
    
        addFriendButton.frame = CGRectMake(237, -10, 64, 64);
    
    
    
        [addFriendButton setImage:addFriendButtonImage forState:UIControlStateNormal];
    
        [addFriendButton setImage:addFriendButtonImageHighlighted forState:UIControlStateHighlighted];
    
        [addFriendButton setImage:addFriendButtonImageHighlighted forState:UIControlStateSelected];
    
    
    
        [addFriendButton addTarget:self action:@selector(handleTouchUpInsideForNonUsers:) forControlEvents:UIControlEventTouchUpInside];
    
    
        addFriendButton.tag = indexPath.row;
    
    
        [cell.textLabel setText:firstNameForTableView2];
    
        [cell.detailTextLabel setText:userNameForTableView2];
    
        [cell.contentView addSubview:addFriendButton];
    
    
    
        }
    
    
    return cell;
    
    }
    

    我没有包含这两个语句触发的完整方法实现,因为它们只处理附加到每个按钮的功能,并且很可能与此问题无关,但我会在此处发布它们。这两个语句可以在if cellForRowAtIndexPath中找到,并处理表视图的两个部分的触摸事件:

    [addFriendButton addTarget:self action:@selector(handleTouchUpInsideForNonUsers:) forControlEvents:UIControlEventTouchUpInside];
    
    [addFriendButton addTarget:self action:@selector(handleTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];
    

1 个答案:

答案 0 :(得分:0)

我看到了尝试在UITableViewCell内设置自定义tableView:cellForRowAtIndexPath:的模式。麻烦的是我认为这是一个错误的地方。如果你真的只使用内置的UITableViewCell,那么它就是正确的地方;对于自定义单元格,它不是。

我建议使用"设置"制作UITableViewCell子类。获取对象并使用该对象设置单元格UI的方法。

例如,从UITableView获取第0部分。我做这样的事情:

@interface UserTableViewCell : UITableViewCell
// properties to IBOutlet connections for UI setup
- (void)setupWithUser:(PFUser *)user;
@end

@implementation UserTableViewCell
- (void)setupWithUser:(PFUser *)user {
    // Set up your UI with properties from 'user'

}
- (IBAction)buttonPressed:(UIButton *)sender {
    // Respond to the button press

}

这样,您可以设置单元格的布局以及IB中按钮的图像,而不是代码。这也使代码更容易阅读(并在6个月后重新阅读!)。

另外,除非2个单元格(第0部分和第1部分)真的可以互换,否则我建议使用UITableViewCell的两个不同的子类来给予你更好的控制,而不是试图强迫一个像另一个,反之亦然。然后,您只需分配不同的标识符并回收相应的类型。