0

我有一个分组表,其中每一行都是它自己的部分。我试图让其中两行将 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。不知道为什么。

4

2 回答 2

0

在创建了一个可以运行的测试项目之后,我重新查看了我的代码,看看它在哪里出错了。在我的 textViewDidChange 方法中,我犯了 = 而不是 == 的 noob 错误。抱歉,添麻烦了!

if (textView.tag = kNameTextViewTag) {
        self.address.name = trimmedString;
    }
    else {
        self.address.notes = trimmedString;
    }
于 2012-09-18T21:45:20.487 回答
0

您应该为每种单元格类型使用不同的重用标识符,否则您为“注释部分”构建的单元格稍后可能会被重用于“名称部分”,反之亦然。

于 2012-09-17T17:58:23.220 回答