6867


(CoreDataを使っています)  
TableViewに一件もセルがない時に、「情報なし」と表示されるようにしたいのですが、  
方法が全くわかりません。  
iphoneの標準の時計アプリのアラームで、アラーム情報がない時に  
「アラームなし」と表示されているので同じことは出来ると思うのですが...

もしもやり方をお知りの方がいらっしゃいましたら  
教えていただけると幸いです。


CC BY-SA 3.0
2015-02-21T07:16:47.130
6859
2015-03-06T06:55:43.823
8320
question
ios objective-c uitableview
TableVIewでセルがない時に「情報なし」と表示されるようにしたいです


UITableViewを、同じframeのUILabelで覆うだけです。  
同じ親ビューに追加して、必要に応じてテーブルを-bringSubviewToFront:するなりhiddenを変えるなりインスタンスごと消すなりします。


CC BY-SA 3.0
2015-02-21T13:33:40.707
6867
2015-02-21T13:33:40.707
6859
answer


自分で回答です。  
最善の解決法ではないと思いますがやっとできたため、  
同じようなことで悩んでいる人が、もしもいた時のために  
投稿しておきます

まず行いたいtableviewControllerのヘッダで

[code]

    @property (strong, nonatomic) UILabel *label;
    
[/code]

のようにラベルの使用を宣言します。

次に実装ファイルで最初に読み込んだ時に、情報が一件もなければNoInformationとでるようにします。

[code]

    - (void)viewDidLoad {
        [super viewDidLoad];
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    
    // 対象エンティティを指定します。
        NSEntityDescription *entity
        = [NSEntityDescription entityForName:@"YourEntityName"  　　　　inManagedObjectContext:self.managedObjectContext];
        [fetchRequest setEntity:entity];
    
    // キャッシュサイズや上限を指定します。
    //ここはコピペなのでいらないかもしれません
        [fetchRequest setFetchBatchSize:20];
        [fetchRequest setFetchLimit:0];
    
    
    
        NSError *error = nil;
        NSInteger count = [self.managedObjectContext  countForFetchRequest:fetchRequest error:&error];
    //ここでコンテキストの件数をNSIntegerに入れて件数がゼロの場合はラベルを表示します
        if(count==0){
        _label =[[UILabel alloc]init];
        [self.view addSubview:_label];
        _label.frame = CGRectMake(self.tableView.frame.origin.x,
                                 self.tableView.frame.origin.y-60,//位置がずれてる分修正してます
                                 self.tableView.frame.size.width,
                                 self.tableView.frame.size.height);
    
        _label.textColor =[UIColor lightGrayColor];
        _label.text =@"NoInformation";
        [_label setTextAlignment:NSTextAlignmentCenter];//文字中央寄せ
        _label.font =[UIFont systemFontOfSize:17];
        [self.view bringSubviewToFront:_label];
    }
    
[/code]

次にセルの削除が行われた時にに表示するようにします

[code]

    -(void)tableView:(UITableView *)tableView commitEditingStyle:    (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath 　*)indexPath {
    　　　　if (editingStyle == UITableViewCellEditingStyleDelete) {
        　　NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
        　　[context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];
    
    
        　　NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    
        // 対象エンティティを指定します。
       　　 NSEntityDescription *entity
        = [NSEntityDescription entityForName:@"YourEntityName" inManagedObjectContext:context];//セル削除後のデータ件数が必要なので上で使ったcontextを使います
        　　[fetchRequest setEntity:entity];
    
        // キャッシュサイズや上限を指定します。
        　　[fetchRequest setFetchBatchSize:20];
        　　[fetchRequest setFetchLimit:0];
    
    
    
        　　NSError *error = nil;
        　　NSInteger count = [context countForFetchRequest:fetchRequest error:&error];
        　　if(count==0){
        　　_label =[[UILabel alloc]init];
        　　[self.view addSubview:_label];
            _label.frame = CGRectMake(self.tableView.frame.origin.x,
                                     self.tableView.frame.origin.y-60,
                                     self.tableView.frame.size.width,
                                     self.tableView.frame.size.height);
    
        　　_label.textColor =[UIColor lightGrayColor];
        　　_label.text =@"NoInformation";
        　　[_label setTextAlignment:NSTextAlignmentCenter];
        　　_label.font =[UIFont systemFontOfSize:17];
        　　[self.view bringSubviewToFront:_label];
        }
    
        if (![context save:&error]) {//先ほどは件数取得のためだけなので不要でしたが、ここはデータセーブが必要です
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
      }
    }
    
[/code]

そしてセルの追加時にラベルを取り除くようにします

[code]

    - (void)insertNewObject:(id)sender
    {
      [_label removeFromSuperview];
    //(以下略)
    }
    
[/code]

現在これで正しく動いているのを確認できています。


CC BY-SA 3.0
2015-03-05T15:12:18.773
7504
2015-03-06T06:55:43.823
2015-03-06T06:55:43.823
8320
6859
answer