詳細ビューの UIButton を介してルート ビュー テーブルに接続された UITableViewCell の項目を更新しようとしています。アイテム セルは、ルート ビューにインポートされ、viewDidLoad に読み込まれて登録され、viewDidAppear で更新され、tableView:cellForRowAtIndexPath でテーブルに追加されます。
- (IBAction)addItem:(id)sender
{
//saves new list
RoomItem *item = [[RoomItem alloc] initWithRoom:[_roomTxt text] Building:[_buildingTxt text]];
[[RoomList sharedStore] createItem:item];
//allows for immediate return to rootView upon action (save button push in this case)
[self.navigationController popToRootViewControllerAnimated:YES];
}
Xcode は「createItem」を予測しますが、「'RoomList' の目に見える @interface がセレクター 'createItem:' を宣言していません」という警告が表示されます。
RoomList.h をインポートしました。
- (RoomItem *)createItem;
+ (RoomList *)sharedStore;
RoomList.m で:
- (RoomItem *)createItem
{
//tracks what number item it's creating
double order;
if ([allItems count] == 0) {
order = 1.0;
}
else
{
order = [[[allItems lastObject] objectIndex] doubleValue] + 1.0;
}
NSLog(@"Adding after %d items, order = %.2f", [allItems count], order);
RoomItem *p = [NSEntityDescription insertNewObjectForEntityForName:@"RoomItem"
inManagedObjectContext:context];
[p setRoom:[NSString string]]; //there was an order call here
[p setBuilding:[NSString string]];
[p setBuildingThumbnail:[UIImage imageNamed:[NSString string]]]; //may need to be changed to another imageNamed function
[p setBuildingThumbnailData:[NSData data]];
[p setObjectIndex:[NSNumber numberWithDouble:order]];
[allItems addObject:p];
return p;
}
+ (RoomList *)sharedStore
{
static RoomList *sharedStore = nil;
if (!sharedStore) {
sharedStore = [[super allocWithZone:nil] init];
}
return sharedStore;
}
+ (id)allocWithZone:(NSZone *)zone
{
return [self sharedStore];
}
RoomItem には次のものがあります。
- (id)initWithRoom:(NSString *)room Building:(NSString *)building;
ここで欠けている可能性があるものに頭を悩ませることはできません。何かご意見は?
ありがとう。
編集 (項目セルに書き込むルート ビュー メソッド):
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
BNRItem *p = [[[BNRItemStore defaultStore] allItems]
objectAtIndex:[indexPath row]];
//[[cell textLabel] setText:[p description]];
//get the new or recycled cell
HomepwnerItemCell *cell = [tableView dequeueReusableCellWithIdentifier:@"HomepwnerItemCell"];
[cell setController:self];
[cell setTableView:tableView];
//configure the cell with the BNRItem
[[cell nameLabel] setText:[p itemName]];
[[cell serialNumberLabel] setText:[p serialNumber]];
[[cell valueLabel] setText:[NSString stringWithFormat:@"$%d", [p valueInDollars]]];
[[cell thumbnailView] setImage:[p thumbnail]];
return cell;
}
これが私のために働いたものです。コア データ エンティティを適切に取得していなかったようです。ただし、index:0 の RoomItem のみを更新するため、objectAtIndex クエリは依然として問題です。更新しようとしている RoomItem のインデックスを取得するにはどうすればよいですか?
- (RoomItem *)updateItemWithRoom:(NSString *)room Building:(NSString *)building
{
NSError *error = nil;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"RoomItem" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
RoomItem *currentRoomItem = [[context executeFetchRequest:request error:&error] objectAtIndex:0];
request = nil;
[currentRoomItem setRoom:room];
[currentRoomItem setBuilding:building];
[self saveChanges];
return currentRoomItem;
}