前提・実現したいこと
objective-Cを使ったアプリを開発しています。
クラウドのデータストアに保存された値を検索し、検索された値を配列に保存し、カスタムセルに配置したラベルにテキストとして反映されたいと思います。
ちなみ使用しているクラウドはニフクラ mobile backendです。
ニフクラドキュメント https://mbaas.nifcloud.com/doc/current/
実行してビルドは通るのですが、セルを表示する画面になるとアプリがクラッシュします。
(11/10プログラム修正しました)
発生している問題・エラーメッセージ
クラッシュする際に表示されるエラーメッセージがこちらです。 -[__NSCFString objectAtIndexedSubscript:]: unrecognized selector sent to instance 0x114e12a20
該当のソースコード
//hファイルです。 #import <UIKit/UIKit.h> #import "TransitionObj.h" #import "CustomCell.h" @interface SecandViewController : UIViewController<UITableViewDelegate,UITableViewDataSource> //@property (weak, nonatomic) IBOutlet UILabel *l1v; @property (strong, nonatomic) TransitionObj* transitionObj; //@property (weak, nonatomic) IBOutlet UITextField *f2v; // テーブルビュー @property (weak, nonatomic) IBOutlet UITableView *tblView; @end
Objective
1//mファイルです。 2#import <Foundation/Foundation.h> 3#import "SecandViewController.h" 4#import "TransitionObj.h" 5#import "givewater.h" 6#import "CustomCell.h" 7#import "NCMB/NCMB.h" 8 9@interface SecandViewController ()<UITableViewDataSource, UITableViewDelegate> 10{ 11 12} 13 14@end 15 16// テーブル表示件数 17//const NSInteger historyNumber = 100; 18 19@implementation SecandViewController 20 21#pragma mark Life Cycle 22 23- (void)viewDidLoad { 24 [super viewDidLoad]; 25 self.msgs = [[NSMutableArray alloc] init]; 26 self.amountwaters = [[NSMutableArray alloc] init]; 27 self.dates = [[NSMutableArray alloc] init]; 28 self.realTemperatures = [[NSMutableArray alloc] init]; 29 self.damiTemperatures = [[NSMutableArray alloc] init]; 30 self.array = [[NSMutableArray alloc] init]; 31 32 // DelegateとDataSourceはstoryboard(またはxib)のところで結び付けるのでもO.K. 33 _tblView.delegate = self; 34 _tblView.dataSource = self; 35 36 // カスタムセルを使用 37 UINib *nib = [UINib nibWithNibName:@"CustomCell" bundle:nil]; 38 [_tblView registerNib:nib forCellReuseIdentifier:@"Cell"]; 39 40 [self kaeruQuery]; 41 42 43} 44-(void)kaeruQuery 45{ 46 NCMBQuery *query = [NCMBQuery queryWithClassName:@"HAGE"]; 47 // query.skip = 4; 48 [query orderByDescending:@"createDate"]; 49 query.limit = 40; 50 [query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) 51 { 52 if (!error) { 53 for (NCMBObject *obj in array) { 54 { 55 if ([obj objectForKey:@"kaerumsg"]) { 56 NSMutableArray* hoge1; 57 hoge1 = [obj objectForKey:@"kaerumsg"]; 58 [self.msgs addObject:hoge1]; 59 NSLog(@"%@",self.msgs); 60 } 61 if ([obj objectForKey:@"water"]) { 62 NSMutableArray* hoge2; 63 hoge2 = [obj objectForKey:@"water"]; 64 [self.amountwaters addObject:hoge2]; 65 NSLog(@"%@",self.amountwaters); 66 } 67 if ([obj objectForKey:@"date"]) { 68 NSMutableArray* hoge3; 69 hoge3 = [obj objectForKey:@"date"]; 70 [self.dates addObject:hoge3]; 71 NSLog(@"%@",self.dates); 72 } 73 if ([obj objectForKey:@"hikakuleaf"]) { 74 NSMutableArray *hoge4; 75 hoge4 = [obj objectForKey:@"hikakuleaf"]; 76 [self.realTemperatures addObject:hoge4]; 77 NSLog(@"%@",self.realTemperatures); 78 } 79 if ([obj objectForKey:@"damileaf"]) { 80 NSMutableArray *hoge5; 81 hoge5 = [obj objectForKey:@"damileaf"]; 82 [self.damiTemperatures addObject:hoge5]; 83 NSLog(@"%@",self.realTemperatures); 84 } 85 86 } 87 88 } 89 [self.tblView reloadData]; 90 } 91 92 93 }]; 94} 95 96 97#pragma mark UITableView 98 99// セクション数 100- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 101 return 1; 102} 103 104// セル数 105- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 106 107 return [self.array count]; 108 109} 110 111 112/* 113- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 114 115 return [self.amountwaters count]; 116 117} 118*/ 119// セルの内容を設定 120- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 121 122 NSLog(@"cellForRowAtIndexPath indexPath:%ld", indexPath.row); 123 124 // カスタムセルを取得 125 CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 126 127 cell.date.numberOfLines = 0; 128 cell.amountwater.numberOfLines = 0; 129 cell.damiTemperature.numberOfLines = 0; 130 cell.realTemperature.numberOfLines = 0; 131 cell.msg.numberOfLines = 0; 132 133 134 cell.msg.text = [self.msgs objectAtIndex:indexPath.row]; 135 cell.amountwater.text = [self.amountwaters objectAtIndex:indexPath.row]; 136 cell.date.text = [self.dates objectAtIndex:indexPath.row]; 137 cell.realTemperature.text = [self.realTemperatures objectAtIndex:indexPath.row]; 138 cell.damiTemperature.text = [self.damiTemperatures objectAtIndex:indexPath.row]; 139 140 /* 141 cell.msg.text = self.msgs [indexPath.row]; 142 cell.amountwater.text = self.amountwaters [indexPath.row]; 143 cell.date.text = self.dates [indexPath.row]; 144 cell.realTemperature.text = self.realTemperatures [indexPath.row]; 145 cell.damiTemperature.text = self.damiTemperatures [indexPath.row];*/ 146 147 return cell; 148} 149 150// セルの高さ設定 151- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 152 153 NSLog(@"heightForRowAtIndexPath indexPath:%ld", indexPath.row); 154 155 //dequeueReusableCellWithIdentifier(セルを使用する) 156 CustomCell *Cell = [self.tblView dequeueReusableCellWithIdentifier:@"Cell"]; 157 158 //とりあえず固定値に 159 return 200; 160} 161 162/** 163 * 文字列に必要な高さを計算する処理 164 * @param text 文字列 165 * @return CGFloat 高さ 166 */ 167 168- (CGFloat)calcHeight:(NSString *)text { 169 170 // 端末サイズ取得 171 CGRect screen = [[UIScreen mainScreen] bounds]; 172 // 表示する幅 (40 + 8 * 3):画像の幅(40)とマージンの合計(8*3) 173 CGFloat width = screen.size.width - (40 + 8 * 3); 174 175 // 表示する最大幅と高さ 176 CGSize maxSize = CGSizeMake(width, CGFLOAT_MAX); 177 178 // 文字列のフォント種類、サイズなど属性を指定 179 NSDictionary *attrDic = @{NSFontAttributeName:[UIFont systemFontOfSize:15.0]}; 180 181 CGRect rect = [text boundingRectWithSize:maxSize 182 options:NSStringDrawingUsesLineFragmentOrigin 183 attributes:attrDic 184 context:nil]; 185 return rect.size.height; 186} 187 188 189// セル押下時の処理 190- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 191 192} 193 194#pragma mark Memory 195 196- (void)didReceiveMemoryWarning { 197 [super didReceiveMemoryWarning]; 198 // Dispose of any resources that can be recreated. 199} 200 201@end 202
//DBの中身
|damileaf|date|hikakuleaf||kaerumsg||water||createDate|
| |11/15|| | | ||value ||2018-11-15T21:29:37.942+09:00|
| value| || value | value || ||2018-11-15T21:29:37.942+09:00|
| |11/15|| | | ||value ||2018-11-15T21:29:37.942+09:00|
| value| || value | value || ||2018-11-15T21:29:37.942+09:00|
//以下省略しています,valueには何かしらの値が入っています
試したこと
NSLogを用いてデータが検索できているかどうか調べましたが、mBassからの検索はできています。
おそらくデータを配列に入れてテキストに表示させるところで間違っていると思いますので、どなたかご指摘よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
iOS11.4
Xcode10.1
回答2件
あなたの回答
tips
プレビュー