UITableViewセルが重なり合う

私が実装しようとしている私のConnectionViewControllerで問題に遭遇しています。これは、行内にBLEデバイスが正しく表示されていないこと、セルが重なっていること、および2つのヘッダーがあることを示しています。これは、tableViewController内にサブビューを追加しているときに、 configureTableView でテーブルを設定する方法によるものと考えています。

ConnectionViewController.h

@interface ConnectDeviceViewController : UIViewController {
    NSMutableArray* cbArray;
}

    @property ( strong ,nonatomic) UITableView *mainTableView;
    @property(nonatomic,strong) CBCentralManager* centralManager;
@end

ConnectionViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
   //Do any additional setup after loading the view.

    [self configureTableView];
    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];  
}
- (void)configureTableView
{
    cbArray = [NSMutableArray array];
    _mainTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, SCREEN_WIDTH, SCREEN_HEIGHT-20) style:UITableViewStylePlain];
    _mainTableView.delegate = self;
    _mainTableView.dataSource = self;
    _mainTableView.backgroundColor = [UIColor whiteColor];
    _mainTableView.backgroundView = nil;
    _mainTableView.allowsMultipleSelectionDuringEditing = NO;
    _mainTableView.autoresizingMask = UIViewAutoresizingNone;
    [self.view addSubview:_mainTableView];
}     

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    CBPeripheral* currentPer = peripheral;
    if(![cbArray containsObject:currentPer]){
        [cbArray addObject:currentPer];
    }

    [_possibleAdapters addObject:peripheral], peripheral.delegate = self;
    [_mainTableView reloadData];


///Stop trying to connect to every peripheral, discover then connecct.
//[_manager connectPeripheral:peripheral options:nil];
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:
(NSInteger)section
{

    return cbArray.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"BLE_DEVICES";
    UITableViewCell* cell;
    cell = [self.mainTableView dequeueReusableCellWithIdentifier:cellIdentifier ];

      if (cell == nil) {
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
  }

      cell.backgroundColor = [UIColor clearColor];
      cell.selectionStyle = UITableViewCellSelectionStyleDefault;

      CBPeripheral* currentPer = [cbArray objectAtIndex:indexPath.row];
      cell.textLabel.text = (currentPer.name ? currentPer.name : @"Not available");

      return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   [_mainTableView deselectRowAtIndexPath:indexPath animated:YES];
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
   return [NSString stringWithFormat:@"Total count %lu",(unsigned long)cbArray.count];
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 40;
}

#pragma mark UITableView Datasource

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 50;
}

私はまだそれに接続しようとしていません。ただデバイスをスキャンし、見つかったときに動的にテーブルにそれらをリストしようとするだけです。

This is how my tableview looks

0
コードを正しくインデントしてください。読めないようです。
追加された 著者 meaning-matters,
viewDidLoadにテーブルビューを追加しないとどうなりますか。ベースビューコントローラに別のタブビューまたは何かがあるように見えます。
追加された 著者 Paulw11,
@ 3rdeye7この行を追加してくださいcell.clipsToBounds = YES;
追加された 著者 KKRocks,
UITableViewCell *セル。 cell = [self.mainTableView dequeueReusableCellWithIdentifier:cellIdentifier];あなたの代わりにこのUITableViewCellのように使うことができます。 * cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
追加された 著者 Rajesh Dharani,
@ 3rdeye7あなたのビュー階層をデバッグできますか?私には2つのUITableViewがあるようです
追加された 著者 Reinier Melian,
@ Paulw11私は同じことを考えていました。最初に私は参照アウトレットで私のtableviewを見ることができない、そうデリゲートとデータソースが設定されているが、私は私のtableviewプロパティをtableviewに設定することができない。ストーリーボードでは適切なカスタムクラスを割り当てられないため、これは実際にはxcodeとストーリーボードの問題です。
追加された 著者 3rdeye7,
@ Paulw11私のストーリーボードは、私のビューコントローラクラスをドロップダウンリストにしていません。これについて何をすべきかわからない
追加された 著者 3rdeye7,

4 答え

autolayout の問題のようで、それがセルと重なっているためです。ただし、セル内の属性に適切に autolayout を設定してみることができます(先頭、末尾、上と下の固定)。その後、 automaticdimesion を使用して、以下のように viewdidload メソッドの行とヘッダーの高さを設定します。

self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0; 
self.tableView.estimatedSectionHeaderHeight = 40
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension

注: - 自動寸法を使用している間は、 tableView heightForRowAtIndexPath および header and footer height デリゲートメソッド

0
追加された

このデリゲートメソッドを追加

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    return 50;//change what you want
}

セクション用

-(CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section {
    return 40;
} 
0
追加された
いや、これはセルサイズを調整するだけです。オーバーラップ問題を解決しません。
追加された 著者 3rdeye7,

さてそれで私はそれを働かせました。これはテーブルセルの問題ではなく、実際にはView Controllerです。 UITableViewControllerを使う代わりに、UIViewControllerを使いました。私がしていたことは私のconfigureTableViewで [self.view addSubview:_mainTableView]; を呼び出すことが私の最初のtableviewcontroller上にtableviewを追加し続けていることです。

別の問題は numberOfSectionsInTableView でした。このデリゲートメソッドを削除しました。

ConnectDeviceViewController.h

#import 
#import 
#import 

@interface ConnectDeviceViewController : UIViewController 

@property(nonatomic,strong) CBCentralManager* centralManager;


@end 

ConnectDeviceViewController.m

#import "ConnectDeviceViewController.h"


#define SCREEN_WIDTH [[UIScreen mainScreen] bounds].size.width
#define SCREEN_HEIGHT [[UIScreen mainScreen] bounds].size.height


@interface ConnectDeviceViewController() {
    UITableView* tableView;
    NSMutableArray* cbArray;

 }

 @end

@implementation ConnectDeviceViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //tableView.delegate = self;
    //tableView.dataSource = self;
    [self configureTableView];
    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];


    //cbArray = [NSMutableArray array];
   //Do any additional setup after loading the view.
}
- (void)configureTableView
{
    cbArray = [NSMutableArray array];
    tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, SCREEN_WIDTH, SCREEN_HEIGHT-20) style:UITableViewStylePlain];
    tableView.delegate = self;
    tableView.dataSource = self;
    tableView.backgroundColor = [UIColor whiteColor];
    tableView.backgroundView = nil;
    tableView.allowsMultipleSelectionDuringEditing = NO;
    tableView.autoresizingMask = UIViewAutoresizingNone;
    [self.view addSubview:tableView];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
   //Dispose of any resources that can be recreated.
}


#pragma mark -
#pragma mark 
- (void)centralManagerDidUpdateState:(CBCentralManager *)central{
    switch (central.state) {
    case CBCentralManagerStatePoweredOff:
        NSLog(@"CoreBluetooth BLE hardware is powered off");
        break;
    case CBCentralManagerStatePoweredOn:
        NSLog(@"CoreBluetooth BLE hardware is powered on and ready");
        [self.centralManager scanForPeripheralsWithServices:nil options:nil];
        break;
    case CBCentralManagerStateResetting:
        NSLog(@"CoreBluetooth BLE hardware is resetting");
        break;
    case CBCentralManagerStateUnauthorized:
        NSLog(@"CoreBluetooth BLE state is unauthorized");
        break;
    case CBCentralManagerStateUnknown:
        NSLog(@"CoreBluetooth BLE state is unknown");
        break;
    case CBCentralManagerStateUnsupported:
        NSLog(@"CoreBluetooth BLE hardware is unsupported on this platform");
        break;
    default:
        break;
}
}

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
    CBPeripheral* currentPer = peripheral;
    if(![cbArray containsObject:currentPer]){
       [cbArray addObject:currentPer];
    }
   LOG( @"DISCOVER %@ (RSSI=%@) w/ advertisement %@", peripheral, RSSI, advertisementData );


 [tableView reloadData];


///Stop trying to connect to every peripheral, then connecct.
//[_manager connectPeripheral:peripheral options:nil];
}


- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {

    NSLog(@"Connection successfull to peripheral: %@",peripheral);

    //Do somenthing after successfull connection.
}

- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"Connection failed to peripheral: %@",peripheral);

    //Do something when a connection to a peripheral failes.
}


#pragma mark -
#pragma mark 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return cbArray.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellIdentifier = @"BLE_DEVICES";
    UITableViewCell *cell;
    cell = [self->tableView dequeueReusableCellWithIdentifier:cellIdentifier ];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    cell.clipsToBounds = YES;

    CBPeripheral* currentPer = [cbArray objectAtIndex:indexPath.row];
    cell.textLabel.text = (currentPer.name ? currentPer.name : @"Not available");

    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
   [self->tableView deselectRowAtIndexPath:indexPath animated:YES];
    CBPeripheral* currentPer = [cbArray objectAtIndex:indexPath.row];
    [self.centralManager connectPeripheral:currentPer options:nil];
    [_bdAdapter connect];
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [NSString stringWithFormat:@"Total count %lu",(unsigned long)cbArray.count];
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    return 50;//change what you want
}
-(CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section {
    return 40; 
}
@end

これは正しく機能します。誰もがtableviewcontrollerを使用して解決策を持っている場合は共有してください。

0
追加された

セルを割り当てた後、サブビューを追加する前に、cellForRowAtIndexPathで以下のコードを使用するだけです。

for (id object in cell.contentView.subviews)
{
[object removeFromSuperview];
} 
0
追加された