UITableView setSeparatorInset 不能正常工作

Posted

技术标签:

【中文标题】UITableView setSeparatorInset 不能正常工作【英文标题】:UITableView setSeparatorInset does not work properly 【发布时间】:2014-08-06 19:08:08 【问题描述】:

我正在尝试为 UITableView 中的分隔符自定义插入。这是我的 viewDidLoad 代码

- (void)viewDidLoad 
    [super viewDidLoad];
    [self.tableView registerClass:[ChatTableCell class] forCellReuseIdentifier:@"ChatCell"];
    [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 65, 0, 0)];

如图所示,单元格分隔符插图无法正常工作。它适用于某些细胞,但不适用于其他细胞。我在这里做错了什么?

这就是我的 viewcontroller.m 文件的样子

#import "ChatListViewController.h"

@interface ChatListViewController ()

@end

@implementation ChatListViewController

- (id)initWithStyle:(UITableViewStyle)style 
    //self = [super initWithStyle:style];
    self = [super initWithStyle:UITableViewStylePlain];
    if (self) 
        self.parseClassName = kChatRoomClassKey;
        self.paginationEnabled = YES;
        self.pullToRefreshEnabled = YES;
        self.objectsPerPage = 25;
        //[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 65, 0, 0)];
    
    return self;


- (PFQuery *)queryForTable 

    if (![PFUser currentUser]) 
        PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
        [query setLimit:0];
        return query;
    

    PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
    [query whereKey:kChatRoomUsersKey equalTo:[PFUser currentUser]];
    [query includeKey:kChatRoomUsersKey];
    [query orderByDescending:@"updatedAt"];

    [query setCachePolicy:kPFCachePolicyCacheThenNetwork];

    // If no objects are loaded in memory, we look to the cache first to fill the table
    // and then subsequently do a query against the network.
    //
    // If there is no network connection, we will hit the cache first.
    if (self.objects.count == 0 || ![[UIApplication sharedApplication].delegate performSelector:@selector(isParseReachable)]) 
        [query setCachePolicy:kPFCachePolicyCacheThenNetwork];
    

    return query;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object 
    static NSString *CellIdentifier = @"ChatCell";

    ChatTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        cell = [[ChatTableCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
        [cell setSelectionStyle:UITableViewCellSelectionStyleGray];

    

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    NSArray *users = [object objectForKey:kChatRoomUsersKey];
    PFUser *cellUser = (PFUser *)[users objectAtIndex:0];
    if ([cellUser.objectId isEqualToString:[PFUser currentUser].objectId]) 
        cellUser = [users objectAtIndex:1];
        NSLog(@"%@", cellUser);
    
    cell.textLabel.font = [UIFont fontWithName:kDefaultFontKey size:17.0];
    cell.detailTextLabel.font = [UIFont fontWithName:kDefaultFontLightKey size:14];
    if ([cellUser isEqual:[NSNull null]]) 
        cell.username.text = @"Selfie User";
        cell.textLabel.font = [UIFont fontWithName:kDefaultFontKey size:17.0];
        cell.latestText.text = [object objectForKey:kChatRoomLatestTextKey];
        cell.detailTextLabel.font = [UIFont fontWithName:kDefaultFontKey size:10.0];
        [cell.avatarImageView.profileImageView setImage:[UIImage imageNamed:@"AvatarPlaceholder.png"]];
    
    else 
        cell.username.text = cellUser.username;
        cell.textLabel.font = [UIFont fontWithName:kDefaultFontKey size:17.0];
        cell.latestText.text = [object objectForKey:kChatRoomLatestTextKey];
        cell.detailTextLabel.font = [UIFont fontWithName:kDefaultFontKey size:10.0];
        if ([[cellUser fetchIfNeeded] objectForKey:kPAPUserProfilePicSmallKey] == nil) 
            [cell.avatarImageView.profileImageView setImage:[UIImage imageNamed:@"AvatarPlaceholder.png"]];
        
        else
            [cell.avatarImageView setFile:[cellUser objectForKey:kPAPUserProfilePicSmallKey]];
    
    return cell;


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    return 70.0f;


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    PFObject *chatRoomObject = [self.objects objectAtIndex:indexPath.row];
    if ([[chatRoomObject objectForKey:kChatRoomReadKey] isEqual:@NO]) 
        [chatRoomObject setObject:@YES forKey:kChatRoomReadKey];
        [chatRoomObject saveEventually];

        UITabBarItem *tabBarItem = [[self.tabBarController.viewControllers objectAtIndex:PAPFriendsTabBarItemIndex] tabBarItem];

        NSString *currentBadgeValue = tabBarItem.badgeValue;

        if (currentBadgeValue && currentBadgeValue.length > 1) 
            NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
            NSNumber *badgeValue = [numberFormatter numberFromString:currentBadgeValue];
            NSNumber *newBadgeValue = [NSNumber numberWithInt:[badgeValue intValue] - 1];
            tabBarItem.badgeValue = [numberFormatter stringFromNumber:newBadgeValue];
         else 
            tabBarItem.badgeValue = @"";
        

    
    ChatViewController *convoVC = [[ChatViewController alloc] init];
    NSArray *users = [[self.objects objectAtIndex:indexPath.row] objectForKey:kChatRoomUsersKey];
    PFUser *cellUser = (PFUser *)[users objectAtIndex:0];
    if ([cellUser.objectId isEqualToString:[PFUser currentUser].objectId]) 
        cellUser = [users objectAtIndex:1];
    
    [convoVC setUser:cellUser];
    [convoVC setChatRoom:[self.objects objectAtIndex:indexPath.row]];
    [self.navigationController pushViewController:convoVC animated:YES];



- (void)viewDidLoad

    [super viewDidLoad];
    [self.tableView registerClass:[ChatTableCell class] forCellReuseIdentifier:@"ChatCell"];
    [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 65, 0, 0)];
        [self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
        [self.navigationItem setTitle:@"Chat"];

        //Change Back button text
        UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
                                       initWithTitle: @""
                                       style: UIBarButtonItemStyleBordered
                                       target: nil action: nil];

        [self.navigationItem setBackBarButtonItem: backButton];
        [self.navigationController setDelegate:self];




-(void)viewDidAppear:(BOOL)animated 

    [self loadObjects];
    //Google Analytics screen tracking
    id tracker = [[GAI sharedInstance] defaultTracker];
    [tracker set:kGAIScreenName
           value:@"Chat"];
    [tracker send:[[GAIDictionaryBuilder createScreenView] build]];


-(void)viewWillAppear:(BOOL)animated 
    [Flurry logEvent:@"Viewed Chat" timed:YES];


-(void)viewWillDisappear:(BOOL)animated 
    [Flurry endTimedEvent:@"Viewed Chat" withParameters:nil];


@end

【问题讨论】:

您希望separatorInset 以何种方式出现?就像第一行一样? 我想要它,就像它在第二行中所做的那样 您需要发布用于编辑 tableview 的所有方法的代码,因为其他地方可能存在问题导致 separatorInset 跳过第一行和第三行。 我编辑了我的问题以包含代码。谢谢 请添加数据源方法numberOfSectionsInTableView:numberOfRowsInSection:的代码。 【参考方案1】:

经过我的所有解决方法,现在已在 ios 7 和 8 测试中修复。

-(void)viewDidLayoutSubviews

  [customTableview setSeparatorInset:UIEdgeInsetsZero];

-(void)tableView:(UITableView *)tableView willDisplayCell:(customCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
    [tableView setSeparatorInset:UIEdgeInsetsZero];


if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) 
    [tableView setLayoutMargins:UIEdgeInsetsZero]; // ios 8 newly added


if ([cell respondsToSelector:@selector(setLayoutMargins:)]) 
    [cell setLayoutMargins:UIEdgeInsetsZero];


【讨论】:

以上是关于UITableView setSeparatorInset 不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章

UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview

UITableView

水平 UITableView 中的垂直 UITableView

如何与重叠显示的 UITableView 交互另一个 UITableView

在 UITableView 中的 UINib 中重新加载 UITableView

iOS小技能:1. 什么是UITableView? 2. UITableView如何展示数据