在 iPhone 中使用开关 ON/OFF 隐藏表格视图单元格

Posted

技术标签:

【中文标题】在 iPhone 中使用开关 ON/OFF 隐藏表格视图单元格【英文标题】:Hiding the table view cells with switch ON/OFF in iPhone 【发布时间】:2012-02-18 06:26:56 【问题描述】:

对于各位专家来说,这可能是一个简单的问题,但我无法找出正确的解决方案。

在我的应用程序中,我创建了一个表格视图来列出项目数量。

在单元格的第一行有一个开关 (ON/OFF)。

所以我的客户需要在 switch 为 OFF 时隐藏底部单元格(第 0 个单元格除外),并在 switch 为 ON 时显示所有单元格。

我通过代码创建了开关。

谁能帮我解决这个问题?

提前致谢。

【问题讨论】:

【参考方案1】:

numberOfRows dataSource 方法 - 使其返回 1 并重新加载TableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
  /// ....
            self.switchView = [[[UISwitch alloc] initWithFrame:CGRectZero]autorelease];
            cell.accessoryView = self.switchView;
            [self.switchView setOn:NO animated:NO];
            [self.switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];

//....


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

   if [self.switchView.on]
       return 1;
   else 
   
      // normal code return
   


- (void) switchChanged:(id)sender 
     [self.tableView reloadData];
 

【讨论】:

@mbh,它是 UITableVIewDataSource 方法,而不是委托方法。 我们不能像ios原生设置应用一样隐藏和显示下面的单元格动画吗?【参考方案2】:

你可以使用insertRowsAtIndexPaths,这不仅会添加,还会做添加新行的动画

首先将目标UIControlEventTouchUpInside 添加到UISwitch

[switch addTarget:self action:@selector(switchChange:) forControlEvents:UIControlEventValueChanged];

-(void) switchChange:(UISwitch*) 发送者

       isSwitchOn = sender.on; //edited
    [myTable beginUpdates];
    NSIndexPath *row1 = [NSIndexPath indexPathForRow:1 inSection:0];
    NSIndexPath *row2 = [NSIndexPath indexPathForRow:2 inSection:0];
    //you may add as many row as you want here.

    [myTable insertRowsAtIndexPaths:[NSArray arrayWithObjects:row1,row2,nil] withRowAnimation:UITableViewRowAnimationMiddle];
    [myTable endUpdates];

并确保在numberOfRowsInSection: 中添加要插入的行数

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

if (isSwitchOn) 返回 1;

否则 返回 3; //开启后会有多少行

您可能需要检查[myTable insertSections:withRowAnimation: 以插入另一个部分并执行与上述相同的操作。但请记住在numberOfSectionsInTableView: 中说明您将添加多少部分

更新:

如果关闭则执行deleteRowsAtIndexPaths:

-(void) switchChange:(UISwitch*) 发送者

    isSwitchOn = sender.on;

  if(isSwitchOn)
        [myTable beginUpdates];
         NSIndexPath *row1 = [NSIndexPath indexPathForRow:1 inSection:0];
         NSIndexPath *row2 = [NSIndexPath indexPathForRow:2 inSection:0];
         //you may add as many row as you want here.

        [myTable insertRowsAtIndexPaths:[NSArray arrayWithObjects:row1,row2,nil]  withRowAnimation:UITableViewRowAnimationMiddle];
        [myTable endUpdates];
    
  else
        [myTable beginUpdates];
         NSIndexPath *row1 = [NSIndexPath indexPathForRow:1 inSection:0];
         NSIndexPath *row2 = [NSIndexPath indexPathForRow:2 inSection:0];
         //you may add as many row as you want here.

        [myTable deleteRowsAtIndexPaths:[NSArray arrayWithObjects:row1,row2,nil]  withRowAnimation:UITableViewRowAnimationFade];
        [myTable endUpdates]; 
 

【讨论】:

【参考方案3】:

有一个 UITableViewDataSource 方法称为 tableView:numberOfRows:inSections 方法。只需检查开关的状态,如果它是 OFF 则返回 1,如果它是 ON,则返回所有行。每次打开和关闭时只需调用 [tableView reloadData] 方法。就这么简单。

【讨论】:

当 reloadData 方法被调用时,它会依次调用以下方法: 1. tableView:numberOfSections: 2 tableView:numberOfRows:inSection: 3. tableView:cellForRowAtIndexPath: methodfs。所以你必须在打开和关闭时调用它。

以上是关于在 iPhone 中使用开关 ON/OFF 隐藏表格视图单元格的主要内容,如果未能解决你的问题,请参考以下文章

set nocount on

为啥profibus通信在有终端电阻情况下通讯异常

如何使用来自 Access VBA 的直通查询执行 SET IDENTITY_INSERT ON/OFF?

Android开关:Switch控件

使用 Interface Builder 进行切换

隐藏或显示表格视图