CoreDataで、あるコンテンツのリレーションしたタグの削除についてのメモ


エントリー Contents と
エントリー Tags があって、リレーションしている。つまり、
Contents* content として、content.tags を持っているとする。
なお、Tags には title アトリビュートがある、つまりTags* tag なら tag.title がある。

それで本題、 content.tags における tag.title = @”xyz” のものの削除手順。

NSString* title = @”xyz”;
NSSet* objSet = [content.tags filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@”title == %@”,title]];
[content removeTags:objSet]; // メソッドが自動でできている!
NSError* error = nil;
if (![content.managedObjectContext save:&error]) {
NSLog(@”Unresolved error %@, %@”, error, [error userInfo]);
abort();
}
NSEnumerator *enumerator = [objSet objectEnumerator];
Tags* tag;
while ((tag = [enumerator nextObject])) {
[managedObjectContext deleteObject:tag];
}
if (![managedObjectContext save:&error]) {
NSLog(@”Unresolved error %@, %@”, error, [error userInfo]);
abort();
}
という感じだろうか?未確認だがメモしておく。

NSDictionaryの中のNSMutableArrayは有効か?


例えば

valuesSections = [NSDictionary dictionaryWithObjectsAndKeys:
[NSMutableArray arrayWithObjects:@””,@””,@””, nil],@”Section1″,
[NSMutableArray arrayWithObjects:@””, @””, nil],@”Section2″,
nil];

のような、NSMutableArrayをセットしたNSDictionary を作っておけば、このNSMutableArray は更新可能だろうか?つまり、

NSMutableArray* valus = [valuesSections objectForKey:@”Section1″];
[values replaceObjectAtIndex:1 withObject:@”New Text”];
[valuesSections setObject:values forKey:@”Section1″];

とできるか?
どうも、だめなようだ。replaceObjectAtIndexの行でエラーになる。
結局、

NSMutableArray* values = [NSMutableArray arrayWithArray:[valuesSections objectForKey:@”Section1″]];

としてから、

[values replaceObjectAtIndex:1 withObject:@”New Text”];

しないとだめなよう。

UITableViewStyleGroupedでdrawRectを使う


UITableViewStyleGroupedはそれ自体使いでのある仕組みだけれど、単にUITableViewのsection headerを固定したいためだけに使いたくなることがある。「section headerの固定」というのはつまり、UITableViewStylePlainだと、テーブルのスクロール中でも「親切にも」あるセクションの表示中はそのセクションのsection headerがナビゲーションバーの下に常に表示されるようになっているのだけれど、そうではなくセクションの先頭行の上に「固定」していて欲しいことがあるということ。

UITableViewStyleGroupedであれば、上記の「固定」の状態になる。
しかし、UITableViewStyleGroupedのセルは角丸四角の特殊な形になってしまう。とりあえず、背景や角丸罫線を消すことはtableView側でできる。

self.tableView.backgroundColor = [UIColor whiteColor];
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.tableView.separatorColor = [UIColor clearColor];

問題はこの上でカスタマイズしたUITabelViewCellを作って drwaRectでなにか描画しても、この角丸四角の範囲の外側に描画したものは表示されないということ。

解決策は簡単、カスタマイズしたUITabelViewCellの中で、

self.backgroundView = [[UIView alloc] initWithFrame:CGRectZero];

とやる。これだけ。

参考にしたのは How to customize the background/border colors of a grouped table view?
下から3番目の投稿。

NSArray count は int なので NSIntegarとの比較に注意


例えば NSIntegar inx という値があって NSArray* array の要素数と比較するとき、inx がマイナス値をとる場合があるときは注意しなければならいと今日知った。

たとえば、 inx = -2 で array の要素数が 5つだとして、もし

if (inx > [array count]) { }

みたいな比較を書いてしまうと、偽でなければならないのに実際の結果は真になってしまう。
これは [array count] が返すのは NSIntegar ではなく、int だからのようだ。
とりあえず、

NSIntegar count = [array count];
if (inx > count) { }

とすれば正しい結果が得られた。