目标C在viewDidAppear上勾选标记行

时间:2016-05-04 05:07:25

标签: ios objective-c uitableview

我的设置屏幕为UITableView,其中包含多行设置。当用户打开该屏幕时,我加载存储的设置并填充到UITextField等......一切都很好。

但是有一些复选标记设置,我一直试图以编程方式检查这个但是不起作用,这是我的代码:

-(void)viewDidAppear:(BOOL)animated{
    [self LoadCurrentRecord];

    if(_previousValid)
    {
        NSIndexPath *regionFromData = [NSIndexPath indexPathForRow:_regionAutoCheck inSection:3];
        [self.tableView cellForRowAtIndexPath:regionFromData].accessoryType = UITableViewCellAccessoryCheckmark;
    }
    [self.tableView reloadData];
}

事实上,我可以看到数据可以通过支票加载到此类别,但我没有看到勾选标记图标。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您必须在此方法中设置

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

  UITableViewCell *cell; // Create Cell
 if(_previousValid && indexPath.row == _regionAutoCheck && indexPath.section == 3 )
 {
 // SET  CHECKMARK
 } else {
 // SET NONE
 }
}

答案 1 :(得分:0)

以下是使用table-和collectionViews的方法:

  1. 拥有一组专用数据元素,每个数据元素将用一个单元格来显示其数据。在您的情况下,这将是某种Region对象。
  2. 实现table / collectionview数据源方法,这些方法返回基于该集合的节中的单元格数和节数。
  3. 确保您在-tableView:cellForRowAtIndexPath: / -collectionView:cellForItemAtIndexPath:中配置每个单元格,就像PKT的答案一样。此单元格可能会被重复使用,因此假设您对此单元的类型所做的任何更改都需要在此更新。
  4. 当数据发生变化时,为对象创建一个indexPath,该对象根据其在集合中的位置而变化。然后为该对象调用' -reloadRowAtIndexPath:' / -reloadItemAtIndexPath。这将导致tableView / collectionView调用-tableViewcellForRowAtIndexPath: / - `collectionView:cellForItemAtIndexPath:'再次。由于此方法现在包含基于数据对象配置单元格的逻辑,因此所有内容都是同步的。
  5. 我无法强调 1。的重要性。最简单的例子是:每个部分都是一个数据对象数组。如果您有多个部分,则可以将每个数组添加到另一个数组:

    // one section:
    NSArray *myData =     
        @[
            @[dataItem1, dataItem2, dataItem3]
            @[dataItem4, dataItem5, dataItem6]
         ];
    
    - (NSUInteger) numberOfSectionsInTableView: (UITableView *) tableView
    {
        return myData.count;
    }
    - (NSUInteger) tableView: (UITableView *) tableView numnberOfRowsInSection: (NSUInteger) section
    {
        NSArray *dataForSection = myData[section];
        return dataForSection.count;
    }
    - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath:
    {
        NSArray *dataForSection = myData[indexPath.section];
        MyObject *dataObject = dataForSection[indexPath.row];
    
        NSString * cellID = @"myCellID";
        UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: cellID];
        if (nil == cell)
        {
            // create a cell
            // ...
        }
    
        // configure the cell based on the data object
        if (dataObject.isBlue)
        {
            cell.contentView.backgroundColor = [UIColor blueColor];
        }
        else
        {
            // N.B.! don't forget the else clause, as cells are reused, so this
            // cell might be recycled from a cell that was used to display
            // the data of a blue data object before.
            cell.contentView.backgroundColor = [UIColor blueColor];
        }
    return cell;
    

    }

答案 2 :(得分:0)

最后,我找到了一个非常简单的解决方案。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.row == _regionAutoCheck && indexPath.section == 3)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else{
        cell.accessoryType = UITableViewCellAccessoryNone; // for other cases remove it
    }
}

<强>更新

之后,将[self.tableView reloadData];添加到-(void)viewDidAppear:(BOOL)animated,您就会看到它有效。

就是这样。

感谢大家的帮助