グループ化されたテーブルがあり、各行は独自のセクションです。2つの行にUITableViewCellのcontentViewのサブビューとしてUITextViewsを持たせようとしています。これは私のcellForRowAtIndexPathメソッド(関連部分)です:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:LeftDetailCellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:LeftDetailCellIdentifier];
}
if (section == kFirstSection) {// some code }
else if (section == kNameSection) {
cell.textLabel.text = @"name";
UITextView *nameTextView = [[UITextView alloc] initWithFrame:CGRectMake(80, 12, kTextViewWidth, kTextViewHeight)];
nameTextView.text = self.address.name;
nameTextView.font = [UIFont boldSystemFontOfSize:12.0];
nameTextView.tag = kNameTextViewTag;
nameTextView.backgroundColor = [UIColor blueColor];
nameTextView.delegate = self;
[cell.contentView addSubview:nameTextView];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
else if (section == kNotesSection) {
cell.textLabel.text = @"notes";
UITextView *notesTextView = [[UITextView alloc] initWithFrame:CGRectMake(80, 12, kTextViewWidth, kTextViewHeight)];
notesTextView.text = self.address.notes;
notesTextView.font = [UIFont boldSystemFontOfSize:12.0];
notesTextView.tag = kNotesTextViewTag;
notesTextView.backgroundColor = [UIColor orangeColor];
notesTextView.delegate = self;
[cell.contentView addSubview:notesTextView];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
UIに名前とメモが表示されるので、セクションが正しいことはわかっています。ただし、私のUITextViewは両方ともorangeColorを持っていることになります。(色は必要ありませんが、textViewデリゲートメソッドで間違った値を取得する理由をトラブルシューティングしようとしています)。
定数ファイルでは、タグを次のように宣言しています。
const NSInteger kNameTextViewTag = 10;
const NSInteger kNotesTextViewTag = 20;
何らかの理由で、tableViewCellに間違ったtextViewが含まれることになります。これには理由がありますか?dequeuReusableCellWithIdentifierメソッドと関係があると思いますが、確かではありません。ありがとう!
編集 マーティンのコメントから、私はこれを試しましたが、それでも機能しません:
static NSString *NameTextViewCellIdentifier = @"NameTextViewCellIdentifier";
static NSString *NotesTextViewCellIdentifier = @"NotesTextViewCellIdentifier";
else if (section == kNameSection) {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NameTextViewCellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:LeftDetailCellIdentifier];
}
cell.textLabel.text = @"name";
UITextView *nameTextView = [[UITextView alloc] initWithFrame:CGRectMake(80, 12, kTextViewWidth, kTextViewHeight)];
nameTextView.text = self.address.name;
nameTextView.font = [UIFont boldSystemFontOfSize:12.0];
nameTextView.tag = kNameTextViewTag;
nameTextView.backgroundColor = [UIColor blueColor];
nameTextView.delegate = self;
[cell.contentView addSubview:nameTextView];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
else if (section == kNotesSection) {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NotesTextViewCellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:LeftDetailCellIdentifier];
}
cell.textLabel.text = @"notes";
UITextView *notesTextView = [[UITextView alloc] initWithFrame:CGRectMake(80, 12, kTextViewWidth, kTextViewHeight)];
notesTextView.text = self.address.notes;
notesTextView.font = [UIFont boldSystemFontOfSize:12.0];
notesTextView.tag = kNotesTextViewTag;
notesTextView.backgroundColor = [UIColor orangeColor];
notesTextView.delegate = self;
[cell.contentView addSubview:notesTextView];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
このクラスの親クラスにUITextViewDelegateがあります。これは、コードを使用してUITextViewのサイズをオンデマンドで変更する別のクラスがあるためです。
- (void)textViewDidChange:(UITextView *)textView {
// Calculate the size of the text to reload the height for that table row
NSString *tempString = textView.text;
NSString *trimmedString = [tempString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"tag: %i ", textView.tag);
if (textView.tag = kNameTextViewTag) {
self.address.name = trimmedString;
}
else {
self.address.notes = trimmedString;
}
[self setTextViewSize:textView]; // set proper text view size
UIView *contentView = textView.superview;
// (1) the padding above and below the UITextView should each be 6px, so UITextView's
// height + 12 should equal the height of the UITableViewCell
// (2) if they are not equal, then update the height of the UITableViewCell
if ((textView.frame.size.height + 12.0f) != contentView.frame.size.height) {
[self.tableView beginUpdates];
[self.tableView endUpdates];
[contentView setFrame:CGRectMake(0,
0,
contentView.frame.size.width,
(textView.frame.size.height+12.0f))];
}
}
だから私のタグはまだ間違っています。このデリゲートメソッドがtextViewという名前で呼び出されると、正しいタグインデックスがログに記録されます。ただし、notes textviewを更新すると、1つのキーエントリの正しいtextViewがログに記録され、その後、名前textViewのログが再び開始されます。理由はわかりません。