0

私は Objective-C と iOS コーディングの世界では初心者なので、少し助けていただければ幸いです。

これが私の問題です。UISegmentedControl を持つ UITableView があります。これには、NSMutableArray を変更してテーブルの内容を変更する 6 つの異なるセグメントがあります。私はそれができたので、すでにかなり誇りに思っていますが、それでも初心者の呪いが今日戻ってきました. セルを選択し、セルのデータを別の UITableView に渡すためにチェックマークを実装したいと考えています。最初の問題は、チェックマークを付けた後、別のセグメントをクリックすると、データが更新されますが、前のセグメントのチェックマークが残っていることです。この問題に対処する方法。

次に、セルを選択して、この UITableView のすべてのセグメントから別のテーブルビューにデータを渡す最良の方法は何ですか?

これが私の 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 で reloadData を実行するたびに、チェック マークが削除されます。これは、新しいセグメントがタップされたときに実行できます。

2回目の編集

次に、didSelectRow と didDeselectRow で 2 つの補完的なメソッドを設定します。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 を使用して新しいテーブルにデータを入力します。

1回目の編集

  • デリゲートを設定する方法の詳細を次に示します

したがって、元のテーブルを持つ 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 getThatArray]; のような self の呼び出しに慣れているかもしれません。デリゲートと同じですが、自分の代わりにデリゲートを呼び出すだけです

これは、h ファイルで myTablePopulatingArray を宣言したと仮定しています。

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

基本的に、ここまででデリゲートを設定しました。私たちは、これが私が必要としているものだと言っています。誰がそれをするつもりですか?この仕事に志願するのは誰か。if(delegate != nil) を安全策として入れていますが、デリゲートがあることを確認するのはあなたなので、実際には必要ないでしょう。

デリゲート自体については、次の 2 つだけが必要です。

  1. OriginalTableViewController.h ファイルに

#import "NextTableViewController.h"

@class DetailViewController; オリジナルTableViewController

  1. OriginalTableViewController.m ファイルに、以前に宣言したメソッドを配置する必要があります

    -(NSMutableArray*)sendThroughTheMutableArray
    {
    return mutableArray;
    }

これで、この mutableArray は tableView に入力する準備が整いました。

于 2012-04-17T05:33:49.660 に答える