如何将相关的 UITextField 文本数据发送到可折叠 UITableView 中的函数?

Posted

技术标签:

【中文标题】如何将相关的 UITextField 文本数据发送到可折叠 UITableView 中的函数?【英文标题】:How can I send the relevant UITextField text data to the function in a collapsable UITableView? 【发布时间】:2014-04-29 07:04:45 【问题描述】:

我有这个可折叠的UITableView,其中每个表格部分的最后一个单元格中有一个UITextField 和一个UIButton。我想将UITextField 中的文本发送到同一单元格中它旁边的UIButton 调用的函数,但我对如何实现这一点感到困惑。提前感谢您的帮助!

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:nil];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    


    if ([self tableView:_tableView canCollapseSection:indexPath.section])
    
        int num = 1;
        if (self.chat[indexPath.section - 1][@"num"] != nil)
            num = [self.chat[indexPath.section - 1][@"num"] intValue] + 1;

        if (!indexPath.row)
        
            cell.textLabel.text = self.chat[indexPath.section - 1][@"msg"]; // only top row showing

            if ([expandedSections containsIndex:indexPath.section])
            
                cell.accessoryView = [DTCustomColoredAccessory accessoryWithColor:[UIColor grayColor] type:DTCustomColoredAccessoryTypeUp];
            
            else
            
                cell.accessoryView = [DTCustomColoredAccessory accessoryWithColor:[UIColor grayColor] type:DTCustomColoredAccessoryTypeDown];
            
        
        else if (indexPath.row < num && indexPath.row >= 1)
        
            cell.textLabel.text = self.chat[indexPath.section - 1][key];
            cell.accessoryView = nil;
        
        else
        
///////////////////////////////////////////
////////This is the important part/////////
///////////////////////////////////////////
            UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(14, 6, 245, 31)];

            self.sendButton = [[UIButton alloc] initWithFrame:CGRectMake(265, 1, 50, 40)];
            [self.sendButton setTitle:@"Reply" forState:UIControlStateNormal];
            [self.sendButton setTitleColor:UIColorFromRGB(0x960f00) forState:UIControlStateNormal];
            [cell addSubview:self.sendButton];

            [self.sendButton addTarget:self action:@selector(sendReply:) forControlEvents:UIControlEventTouchUpInside];

            [cell addSubview:field];
            cell.accessoryView = nil;


        
    
    else
    
        cell.accessoryView = nil;
        cell.textLabel.text = @"Normal Cell";

    

    return cell;

【问题讨论】:

【参考方案1】:

通过以下方式为文本字段和按钮赋予一些独特的标签:

//////////////////////////////////// ////////这是重要的部分///////// ///////////////////////////////////

UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(14, 6, 245, 31)];

    self.sendButton = [[UIButton alloc] initWithFrame:CGRectMake(265, 1, 50, 40)];
    [self.sendButton setTitle:@"Reply" forState:UIControlStateNormal];
    [self.sendButton setTitleColor:UIColorFromRGB(0x960f00) forState:UIControlStateNormal];
    self.sendButton.tag = indexPath.section *1000 + indexPath.row;
    [cell addSubview:self.sendButton];

    [self.sendButton addTarget:self action:@selector(sendReply:) forControlEvents:UIControlEventTouchUpInside];

    field.tag = self.sendButton.tag + 1;
    [cell addSubview:field];
    cell.accessoryView = nil;

现在是按钮事件,

-(void) sendReply:(UIButton *)sender

UITextField *field = [YOOUR_TABLE_VIEW viewWithTag:sender.tag + 1];
//Do you coding here

【讨论】:

你好,你能重新打开我的问题吗?现在更清楚,更具体了..***.com/q/23333829/2722799 因为这个问题我禁止提问,但现在我根据论坛要求编辑了我的问题。【参考方案2】:

创建一个自定义 UITableViewCell,其中包含 uitextfield 和一个按钮,并为您创建的自定义 uitableviewcell 创建一个协议/委托。这样您将来可以更好地控制您的代码和按钮的事件。 .

查看本教程:http://www.codigator.com/tutorials/ios-uitableview-tutorial-custom-cell-and-delegates/

干杯

【讨论】:

更灵活的方法 文本字段和按钮应该是单元格的属性,按钮的目标也应该是单元格..【参考方案3】:

为此,

在 cellForRowAtIndexPath: 分配发送按钮的方法中,添加一行只是为了给发送按钮提供一些标识符,如下所示,

[self.sendButton setAccessibilityIdentifier:[NSString stringWithFormat:@"%d#%d",indexPath.row,indexPath.section]];

现在,在 sendReply: 方法中,

//First get the row and section information
NSString *str=[sender accessibilityIdentifier];
NSArray *arr=[str componentsSeparatedByString:@"#"];
//Get the index path
NSIndexPath *iRowId =[NSIndexPath indexPathForRow:[[arr objectAtIndex:0] intValue] inSection:[arr objectAtIndex:1] intValue]];

//get the cell
UITableViewCell *objCell=(UITableViewCell*)[tblviwBasketCell cellForRowAtIndexPath:iRowId];

现在 objCell 将是您添加按钮和文本视图的单元格。因此获取 objCell 的子视图并访问文本字段以获取文本。

【讨论】:

只是要指出,如果使用标准单元而不是子类化,则不需要显式类型转换 cellForRowAtIndexPath:【参考方案4】:

正如您所说,每个部分都有一个文本字段。您应该将UIButtonUITextFieldtag 设置为与indexPath.section 相同。

然后,在目标方法中,使用此tag 值从相关部分获取相关单元格,并遍历它的subviews 以获取您的textField

在目标方法中,你应该这样做:

- (void) sendReply:(id)sender 

    int section = [(UIButton*)sender tag];

    int row = [myTableView numberOfRowsInSection:section] - 1;//assuming it is the last cell in the section that contains your textField.

    NSIndexPath* indexPath = [NSIndexPath indexPathForRow:row inSection:section];

    UITableViewCell* cell = [myTableView cellForRowAtIndexPath:indexPath];

    for (UIView* vu in cell.subviews) 

         if ([vu isKindOfClass:[UITextField class]]) 

                NSString* textString = [(UITextField*)vu text];

                //perform any tasks you want with the text now
            
    

您可以简单地使用viewWithTag:,因为它会进行迭代搜索,但所有额外代码都是为了避免在到达相关单元格之前遍历所有单元格。

【讨论】:

以上是关于如何将相关的 UITextField 文本数据发送到可折叠 UITableView 中的函数?的主要内容,如果未能解决你的问题,请参考以下文章

将占位符添加到 UITextField,如何以编程方式快速设置占位符文本?

如何在键入时使 UITextField 宽度调整为文本?

如何垂直居中 UITextField 文本?

如何实现占位符文本在 UITextField 中逐个字符消失

如何将 uitextfield 字符范围限制为 10 位

如何在 swift 2 中将 UITextField 保存到核心数据?