菜鸟教程小白 发表于 2022-12-13 06:51:04

ios - 在动态 tableView 中重新加载包含 textFields 的单元格时的奇怪行为


                                            <p><p>我有一个带有自定义单元格的动态 tableView,每个单元格都包含一个 textField 和标签。我想要以下行为:</p>

<hr/>

<p>用户点击“添加”按钮,表格在索引 0 处插入一个单元格,单元格的 textField 成为第一响应者。</p>

<p>当用户完成输入数据时,单行文本字段将作为第一响应者退出并隐藏自身。 </p>

<p>然后单元格的标签变为可见,填充用户输入,并自动调整其高度以适应输入。此时单元格也会调整大小。</p>

<hr/>

<p>我的代码在第一次添加单元格时会执行此操作,但是当添加更多单元格时,它会变得很奇怪。第二个添加的单元格
s textField 不会成为第一响应者,而是由前一个 textField 中的文本填充。后续添加的单元格显示为空白,除每 6 个空白单元格外,显示第一个单元格的文本。</p>

<p>发生了什么,我该如何解决?</p>

<p><strong>编辑:感谢@Rayfleck,我已经解决了第二个添加的单元格被前一个 textField 中的文本填充的问题,但是添加的第二个单元格(以及随后添加的单元格)仍然没有成为第一响应者。</strong></p>

<p>这是展示此行为的演示:</p>

<p> <img src="/image/tm5Lg.gif" alt="enter image description here"/> </p>

<p>这是我的代码:</p>

<pre><code>#define FONT_SIZE 16.0f
#define CELL_CONTENT_WIDTH 300.0f // This will change for different size!
#define CELL_CONTENT_MARGIN_WIDTH 10.0f
#define CELL_CONTENT_MARGIN_HEIGHT 20.0f

@interface ViewController ()

@property (strong) IBOutlet UITableView *tableView;
@property (strong) NSMutableArray *notesArray;

@end

@implementation ViewController

- (void)viewDidLoad {
    ;

    self.notesArray = ;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    // Return the number of sections.
    return 1;
}

- (IBAction)addButtonTapped {

    NSMutableArray *indexPaths = ;
    ]; // insert at first index

    ; // go into edit mode so cell has label hidden and textField visible

    // do the insertion
    ; // placeholder for when user starts typing
    ;
    ;
    ;

    ;
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField {

    NSIndexPath *path = ; // first table cell
    HC_NoteCell *cell = (HC_NoteCell *);

    cell.noteTextField.hidden = YES;
    cell.noteLabel.text = cell.noteTextField.text;
    cell.noteLabel.hidden = NO;

    ;

    ;

    // Need to reload rows so cell height can be recalculated
    ;
    withRowAnimation:UITableViewRowAnimationAutomatic];
    ;

    return YES;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return self.notesArray.count;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *text;
    text = ;

    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN_WIDTH * 2), 20000.0f);

    UIFont *font = ;
    NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject:font
                                                                forKey:NSFontAttributeName];
    NSAttributedString *attributedString = [ initWithString:text attributes:attrsDictionary];

    CGRect paragraphRect = ;

    CGFloat height = MAX(paragraphRect.size.height, 22.0f);

    return height + (CELL_CONTENT_MARGIN_HEIGHT * 2);

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @&#34;NoteCell&#34;;

    HC_NoteCell *cell = ;
    if (cell == nil) {
      cell = [ initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    if (self.tableView.isEditing) {

      cell.noteLabel.hidden = YES;
      cell.noteTextField.hidden = NO;
      cell.noteTextField.delegate = self;

      ;

    } else {

      cell.noteLabel.hidden = NO;
      cell.noteTextField.hidden = YES;
      cell.noteTextField.delegate = self;

      cell.noteLabel.text = ;
    }

    return cell;
}

@end
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果您正在重用/取消单元格,那么在 cellForRowAtIndexPath 中,您必须为单元格的每个 subview 设置新值,因为它可能包含前一个单元格的内容。</p>

<p>所以 <code>cell.noteLabel.text = nil;</code> 在所有情况下,然后在你的 else 情况下,从数组中设置它的值。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在动态 tableView 中重新加载包含 textFields 的单元格时的奇怪行为,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/29946538/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/29946538/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在动态 tableView 中重新加载包含 textFields 的单元格时的奇怪行为