我有一个分组表,其中每一行都是它自己的部分。我试图让其中两行将 UITextViews 作为 UITableViewCell 的 contentView 的子视图。这是我的 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 中,我会看到相应的名称和注释。但是,我的 UITextViews 最终都具有橙色颜色。(我不想要颜色,但我试图解决为什么我在我的 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 调用时,会记录正确的标签索引。但是,当我更新注释 textview 时,它会为一个键条目记录正确的 textView,然后再次开始记录名称 textView。不知道为什么。