我有一个永远不会一致的UITableView。该表视图有2个部分。
我创建了2个UIButton,它们实际上是相同的图像,但一个是灰色,一个是红色。
当UITableView首次加载时,UITableView中的每一行都应该有灰色按钮,然后如果用户点击一个按钮,它就会切换到该按钮的红色版本。
出于某种原因,我在iPhone上使用此UITableView加载视图控制器时,大约有80%的时间,第一部分中的前两行将没有按钮。有点奇怪的是,如果我按下我的手指按钮应该是两件事情发生了:
所以就像灰色按钮在那里,它只是看不见。这不起作用,因为如果用户看到没有按钮的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];
答案 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
的两个不同的子类来给予你更好的控制,而不是试图强迫一个像另一个,反之亦然。然后,您只需分配不同的标识符并回收相应的类型。