2

私のプロジェクトには、10個のセルを持つtableViewがあります。そして、didSelectRowAtIndexPathすべてのセルに複数のViewController(ファイル)があるので、私のようにdidSelectRowAtIndexPath見えます

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

if(indexPath.row == 0) {

            CallViewController *viewc = [[CallViewController alloc] initWithNibName:@"CallViewController" bundle:nil];
            [self.navigationController pushViewController:viewc animated:YES];
        }else if(indexPath.row == 1) {
            BirthdayViewController *viewc = [[BirthdayViewController alloc] initWithNibName:@"BirthdayViewController" bundle:nil];
            [self.navigationController pushViewController:viewc animated:YES];
        }

だから私はこれらの条件を望まない私は私のコードをきれいにしたい

4

4 に答える 4

3

Classクラスのオブジェクトを含む配列を作成してから、オブジェクトを作成して次のようにプッシュすることをお勧めします。

//view did load

mutableArr = [[NSMutableArray alloc] init];
[mutableArr addObject:[CallViewController class]];
[mutableArr addObject:[BirthdayViewController class]];
....
....

その後、あなたの

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   if (indexPath.row < [mutableArr count]) {
       Class *obj = [mutableArr objectAtIndex:indexPath.row];
       UIViewController *controller = [[objc alloc] initWithNibName:NSStringFromClass(obj) bundle:nil];
       [self.navigationController pushViewController:controller animated:YES];
   }
}

または、これがより奇妙に見える場合は、このようにすることができます

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   UIViewController *controller = nil;
   switch(indexPath.row) {
       case 0:
          controller = [[CallViewController alloc] initWithNibName:@"CallViewController" bundle:nil];
          break;
       case 1;
          controller = [[BirthdayViewController alloc] initWithNibName:@"BirthdayViewController " bundle:nil];
          break;
   }
    [self.navigationController pushViewController:controller animated:YES];
}
于 2012-12-20T12:00:02.657 に答える
2

テーブルビューの基礎となるデータモデルは何ですか?ViewControllerクラス名として属性を追加できる場合は、次のようにすることができます。

- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *row = [rowData objectAtIndex:indexPath.row];
Class viewControllerClass =
    NSClassFromString([row objectForKey:@"viewControllerClassName"]);

//Default VC init looks for nib file named as VC afaik, if not, you could
    //add another attribute with init selector name
UIViewController *viewController =
    [[viewControllerClass alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
}
于 2012-12-20T11:59:28.710 に答える
1

ファイル名に対応する文字列の配列を作成し、NSClassFromString関数を使用してビューコントローラを割り当てることができます

NSArray *viewControllers = [NSArray arrayWithObjects:@"VC1", @"VC2", @"VC3", nil];
id viewController = [[NSClassFromString([viewControllers objectAtIndex:indexPath.row]) alloc] initWithNibName:[viewControllers objectAtIndex:indexPath.row] bundle:nil];
[[self navigationController] pushViewController:viewController animated:YES];
[viewController release];
于 2012-12-20T11:59:44.327 に答える
1

あなたはこれを行うことができます:

すべてのクラスをNSArrayに追加し、indexPath.rowで正しいクラスを選択します。

- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
      NSArray * conrollersClasses =@[[CallViewController class],[BirthdayViewController class]];
      UIViewController *controller = [[conrollersClasses[indexPath.row] alloc] init];
      [[self navigationController] controller animated:YES];

}
于 2012-12-20T12:04:22.610 に答える