【问题标题】:Disable textfield for other table view cells, when one of the cell is selected选择一个单元格时,禁用其他表视图单元格
【发布时间】:2017-01-10 07:07:56
【问题描述】:

我在tableView 的自定义单元格上有一个textField。 When one of the cell is selected I am able to disable textField for that particular cell by using set selected method.

(void)setSelected:(BOOL)selected animated:(BOOL)animated { 
   [super setSelected:selected animated:animated]; 
if (selected) {
   self.accountNameTxtField.enabled = NO; 
} else { 
   self.accountNameTxtField.enabled = YES; 
   } 
}

要求是在选择cell 中的任何一个时为其他单元格禁用textField。请指导我,谢谢。

【问题讨论】:

  • 首先禁用所有文本字段而不是启用特定文本字段,这样很容易
  • - (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; [cell.textField 成为FirstResponder]; }
  • 试试这个代码来启用特定的文本字段
  • 您好,您希望我在自定义单元格中评论上述代码并在表格视图中尝试此操作吗?
  • 您是否希望在开始时禁用所有UITextField,并且只应在用户单击单元格后启用?

标签: ios objective-c uitableview tableviewcell


【解决方案1】:

你必须使用实例变量,你可以使用 indexPath。

当用户选择任何单元格时,将该实例变量的值设置为选定的 indexPath。

然后重新加载表格。

cellForRowAtIndexPath中检查当前indexPath是否被选中indexPath,如果是则启用textField,否则禁用它。

【讨论】:

  • 感谢您的回复。能不能说的详细点。
  • This 看起来几乎相似,只是假设启用了 textField 而不是复选标记。
【解决方案2】:

在 tableview 单元格上创建按钮并在 tableview 上启用或禁用文本字段,或者可以在 tableview didSelectRowAtIndexPath 上应用此逻辑

-(void) btnClick:(id)sender
{
 UIButton *btn = (UIButton *)sender;
CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:tblView];
NSIndexPath *indexPath = [tblView indexPathForRowAtPoint:buttonPosition];
NSLog(@"table view row is ----%ld",indexPath.row);

 if (btn.isSelected == false) 
 {
    [btn setSelected:true];
   [selectRow addObject:[NSString stringWithFormat:@"%ld",indexPath.row]];
    self.accountNameTxtField.enabled = yes;
   //selectRow is NSMutableArray
 }
  else 
 {  [btn setSelected:false];
    [selectRow removeObject:[NSString stringWithFormat:@"%ld",indexPath.row]];
    self.accountNameTxtField.enabled = no;
 }
 }

   [tbleview relaoddata];
 if ([selectRow containsObject:[NSString  stringWithFormat:@"%ld",indexPath.row]])
 {  
 accountNameTxtField.enabled = yes; 
 }
else
{  
 accountNameTxtField.enabled = NO; 
}

【讨论】:

  • 令人困惑,您正在创建 btn 操作按钮。
  • 您可以在 uitableview 单元格上创建文本字段,并且选择可以使用相同的逻辑。您需要检查包含行索引方法的单元格中的对象
【解决方案3】:

使用您的数据来执行此操作,您必须在包含字典或类对象的数组中包含一些数据,我正在演示类对象。

假设您有一个 Class 对象 DataClass 创建一个 BOOL 属性,例如 textFieldSelected,现在按照步骤操作

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TableViewCell" forIndexPath:indexPath];

    DataClass *object=[self.dataArray objectAtIndex:indexPath.row];    
    [cell.textField setTag:indexPath.row];

    cell.textField.delegate=self;

    cell.textField.enabled=object.textFieldSelected;

    return cell;
}

现在当你选择一行时

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    for(DataClass *object in self.dataArray){
        object.textFieldSelected=NO;
    } 
    DataClass *object=[self.dataArray objectAtIndex:indexPath.row];
    object.textFieldSelected=YES;
    [tableView reloadData];

}

最初您可以设置textFieldSelected=YES; 以便启用所有文本字段。您可能希望玩对象,它会以这种方式工作。一切顺利。

【讨论】:

  • 您好。感谢您的回复,我应该将属性创建为非原子,分配吗?
  • YES,因为它是 BOOL
  • 我创建了该属性。当我选择单元格时,未选择单元格。我应该在自定义单元格中评论我上面的代码吗?
  • @Sadik 是的,这可能会覆盖呼叫。
  • 将此[self.tableView setAllowsSelection:YES]; 添加到viewDidLoad 并检查。
【解决方案4】:

最后我设法找到整数单元格选择计数的解决方案。

单元格选择计数增加将在索引路径方法中选择行并在 NsuserDefaults 中设置该值。

selectedIndex++;

NSString *valueToSave = [NSString stringWithFormat:@"%ld",(long)selectedIndex];
[[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"SelectedIndexString"];
[[NSUserDefaults standardUserDefaults] synchronize];

在 didDeselectRowAtIndexPath 方法中单元格选择计数减少,并在 NsuserDefaults 中设置该值。

selectedIndex--;

在我的自定义表格视图单元格类中的 textFieldDidBeginEditing 方法中,从 NsUserDefaults 获取存储的值并采取行动。

NSString *SelectedIndexString = [[NSUserDefaults standardUserDefaults] stringForKey:@"SelectedIndexString"];

NSLog(@"%ld",(long)SelectedIndexString);
NSInteger SelectedIndexCount = [SelectedIndexString integerValue];

if (SelectedIndexCount) {
    self.accountNameTxtField.enabled = NO;
}
else{
    self.accountNameTxtField.enabled = YES;

}

非常感谢你们。感谢您的宝贵时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    相关资源
    最近更新 更多