带有分段控制和复选标记附件的UITableView

时间:2012-04-16 23:52:38

标签: objective-c uitableview uisegmentedcontrol checkmark pass-data

我是Objective-C和iOS编码领域的新手,所以我会感激一点帮助。

这是我的问题。我有一个带UISegmentedControl的UITableView。这个有6个不同的段,通过修改NSMutableArray来修改表的内容。我设法做到这一点,所以我已经为我感到骄傲,但今天仍然有新手诅咒。我想实现选中标记以选择单元格并将单元格的数据传递给另一个UITableView。第一个问题是我有我的复选标记,但我点击了不同的段,数据被更新,但前一段的复选标记仍然存在。如何解决这个问题。

第二,通过选择单元格,将数据从这个UITableView的所有段传递到另一个tableview的最佳方法是什么?

这是我的UITableViewController.h

@class MesExercicesViewController;

@protocol MesExercicesViewControllerDelegate <NSObject>

- (void) mesExercicesViewControllerDidCancel:
(MesExercicesViewController *) controller;

- (void) mesExercicesViewControllerDidSave:
(MesExercicesViewController *)controller;

@end



@interface MesExercicesViewController : UITableViewController {
NSMutableArray *exercicesList;
UISegmentedControl *segment;
}

- (IBAction)segmentChange;

@property (nonatomic, retain) IBOutlet UISegmentedControl *segment;

@property (nonatomic, weak) id <MesExercicesViewControllerDelegate> delegate;

- (IBAction)cancel:(id)sender;

- (IBAction)done:(id)sender;

@end

这是UITableViewController.m中UISegmentedControl的代码

- (void)viewDidLoad {

[super viewDidLoad];
exercicesList = [NSMutableArray arrayWithObjects: 



@"A",@"A1",@"A2",@"A3",@"A4",@"A5",@"A6",@"A7", nil];
}


- (IBAction)segmentChange {
if (segment.selectedSegmentIndex == 0) {
    exercicesList = [NSMutableArray arrayWithObjects:@"A",@"A1",@"A2",@"A3",@"A4",@"A5",@"A6", nil];
    [[self tableView]reloadData]; 

} else if (segment.selectedSegmentIndex == 1) {
    exercicesList = [NSMutableArray arrayWithObjects:@"C",@"C1",@"C2",@"C3",@"C4", nil];
    [[self tableView] reloadData];

} else if (segment.selectedSegmentIndex == 2) {
    exercicesList = [NSMutableArray arrayWithObjects:@"E",@"E1",@"E2",@"E3",@"E4",@"E5",@"E6",@"E7",@"F",@"F1", nil];
    [[self tableView] reloadData];
} else if (segment.selectedSegmentIndex == 3) {
    exercicesList = [NSMutableArray arrayWithObjects:@"I",@"I1",@"I2",@"I3",@"I4",@"I5",@"I6",@"I7",@"I8",@"J", nil];
    [[self tableView] reloadData];

} else if (segment.selectedSegmentIndex == 4) {
    exercicesList = [NSMutableArray arrayWithObjects:@"L",@"M",@"M1",@"N",@"N1", nil];
    [[self tableView] reloadData];

} else if (segment.selectedSegmentIndex == 5) {
    exercicesList = [NSMutableArray arrayWithObjects:@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z", nil];
    [[self tableView] reloadData];

}
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryType == UITableViewCellAccessoryNone) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;

    //reflect selection in data model
}else if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
    cell.accessoryType = UITableViewCellAccessoryNone;

    //reflect the deselection in data model
}

非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

首先,在你的cellForRowAtIndexPath中设置

  

cell.accessoryType = UITableViewCellAccessoryNone;

这样,无论何时在tableView上重新加载数据,它都会删除复选标记。您可以在点按新细分时执行此操作。

第二次编辑

其次,在didSelectRow和didDeselectRow中设置2个免费方法。在viewDidLoad中创建一个NSMutableArray,然后添加到它。所以你的didSelectRow会有:

  
      
  • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
      {
        [mutableArray addObject:[exerciseList objectAtIndex:indexPath.row]];
      }
  •   

你的didDeselectRow会有

  
      
  • (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
       {
      [mutableArray removeObject:[exerciseList objectAtIndex:indexPath.row]];
      }
  •   

就复选标记而言,你实现了吗?

  

[[self tableView] setEditing:YES animated:YES];

然后你将使用这个mutableArray来填充新表。

第一次编辑

  • 以下是有关如何设置委托
  • 的一些额外详细信息

因此,让我们调用具有原始表的VC - OriginalTableViewController 和你想要从mutableArray填充的新表的VC - NextTableViewController(最好远离任何名称开头的'new'一词......)

NextTableViewController.h - 紧跟#import&lt;的UIKit / UIKit.h&GT;

@class NextTableViewController;

@protocol NextTableViewControllerDelegate  
 -(NSMutableArray*)sendThroughTheMutableArray;  
@end

宣布你的代表

  

@property(nonatomic,assign)id delegate;

NextTableViewController.m

  

@synthesize delegate;

然后,你可能熟悉打电话给自己 - [self getThatArray];与委托相同,但你只是调用委托代替自我

这假设您已在h文件中声明了myTablePopulatingArray:

  

if(delegate!= nil)
  {
      myTablePopulatingArray = [[NSMutableArray Alloc] initWithArray:[delegate sendThroughTheMutableArray]];
  }

基本上我们刚刚设置了委托。我们说,这就是我需要的。谁能胜任?谁将自愿参加这项工作。我们把if(delegate!= nil)作为安全 - 但你是那个确保有代表的人,所以你可能不需要它

现在代表本身 - 你只需要两件事:

  1. 在您的OriginalTableViewController.h文件中
  2.   

    #import“NextTableViewController.h”

         

    @class DetailViewController;       OriginalTableViewController

      在您的OriginalTableViewController.m文件中
    1. ,您必须放置之前声明的方法

        

      - (NSMutableArray的*)sendThroughTheMutableArray
        {
        return mutableArray;
        }

    2.      所以这个mutableArray现在可以填充你的tableView。