0

我是 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
}

非常感谢您提前提供的帮助

4

1 回答 1

0

首先,在你的 cellForRowAtIndexPath 集中

cell.accessoryType = UITableViewCellAccessoryNone;

这样,每当您在 tableView 上重新加载数据时,它都会摆脱复选标记。您可以在点击新段时执行此操作。

第二次编辑

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

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

你的 didDeselectRow 会有

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

就复选标记而言,您实施了吗?

[[self tableView] setEditing:YES 动画:YES];

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

第一次编辑

  • 这是有关如何设置委托的一些额外细节

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

NextTableViewController.h - 在# import < UIKit/UIKit.h> 之后

@class NextTableViewController;

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

声明你的代表

@property (nonatomic, assign) id 委托;

NextTableViewController.m

@synthesize 代表;

然后,您可能熟悉对 self 的调用 - [self getThatArray]; 与委托相同,但您只需调用委托而不是自我

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

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

基本上到此为止,我们刚刚设置了委托。我们说,这就是我需要的。谁愿意呢?谁将自愿从事这项工作。我们将 if(delegate != nil) 作为安全措施 - 但您将确保有委托,因此您可能并不需要它

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

  1. 在 OriginalTableViewController.h 文件中

#import "NextTableViewController.h"

@class DetailViewController; 原始表视图控制器

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

    -(NSMutableArray*)sendThroughTheMutableArray
    {
    return mutableArray;
    }

所以这个 mutableArray 现在已准备好填充您的 tableView。

于 2012-04-17T05:33:49.660 回答