0

グループ化されたテーブルがあり、各行は独自のセクションです。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のログが再び開始されます。理由はわかりません。

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 に答える