【问题标题】:UITableView with UISegmented control and checkmark accessory带有 UISegmented 控件和复选标记附件的 UITableView
【发布时间】:2012-04-28 07:44:14
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    首先,在你的 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 Animation:YES];

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

    第一次编辑

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

    所以让我们调用拥有原始表的 VC - OriginalTableViewController 以及带有要从 mutableArray 填充的新表的 VC - NextTableViewController(最好远离任何名称开头的“新”一词......)

    NextTableViewController.h - 在# import

    之后
    @class NextTableViewController;
    
    @protocol NextTableViewControllerDelegate  
     -(NSMutableArray*)sendThroughTheMutableArray;  
    @end
    

    声明你的代表

    @property (nonatomic, assign) id delegate;

    NextTableViewController.m

    @synthesize 委托;

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

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

    如果(委托!= nil)
    {
    myTablePopulatingArray = [[NSMutableArray Alloc] initWithArray: [delegate sendThroughTheMutableArray]];
    }

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

    现在对于委托本身 - 你只需要两件事:

    1. 在 OriginalTableViewController.h 文件中

    #import "NextTableViewController.h"

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

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

      -(NSMutableArray*)sendThroughTheMutableArray
      {
      返回可变数组;
      }

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

    【讨论】:

    • 非常感谢您的回答。我试试看。
    • 好的,多亏了你,附件问题得到了解决,但现在我正在努力从我的其他 UITableViewController 访问新创建的 NSMutableArray (mutableArray)。我知道最好的方法之一是创建一个委托,但我现在正在调查......如果你有任何提示,我将不胜感激。
    • 所以我刚刚在我的答案中添加了更多细节。我也已经说明了如何设置委托。让我知道你的情况。
    • 非常感谢,我明天试试,因为今天有点忙。不用担心格式,我也是 SO 的新手 :-) 非常感谢您的帮助 Shane。我真的很感激。
    • 好的,我在您的回答基础上进行了编辑,让您知道我到底做了什么,以便查看我的代码有什么问题。再次感谢您抽出一些时间来解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多