web-dev-qa-db-ja.com

Xcodeストーリーボードを使用してテーブルビューセルから詳細ビューにプッシュする

ViewController内にテーブルビューがあります。テーブルビュー内にすべての情報を入力できます。ただし、詳細ビューを設定するのに少し迷っています。各テーブルセルには、各詳細ビューへのセグエが必要だと思いますが、完全にはわかりません。

これが私のコードです。テーブルビューから詳細ビューへのセグエを達成するために何が欠けていますか?コード:

.h 

@interface DetailViewController : UIViewController <UITableViewDelegate,UITableViewDataSource>  
{ 
    IBOutlet UITableView *myTable;
    NSMutableArray *contentArray;
}

@property (strong, nonatomic) IBOutlet UITableView *myTable;

.m


- (void)viewDidLoad 
{
    contentArray = [[NSMutableArray alloc]init];
    [contentArray addObject:@"Espresso"];
    [contentArray addObject:@"Latte"];
    [contentArray addObject:@"Capicino"];
    [super viewDidLoad];
     // Do any additional setup after loading the view.
}

//Table Information
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [contentArray count];
}

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

     [tableView deselectRowAtIndexPath:indexPath animated:YES];

     if([[contentArray objectAtIndex:indexPath.row]isEqualToString:@"EspressoViewController"])
     {
         EspressoViewController *espresso = [[EspressoViewController alloc]initWithNibName:@"EspressoViewController" bundle:nil];  
         [self.navigationController pushViewController:espresso animated:YES];
     }
     else if ([[contentArray objectAtIndex:indexPath.row] isEqualToString:@"Latte"])
     {
         LatteViewController *latte = [[LatteViewController alloc] initWithNibName:@"Latte" bundle:nil];
         [self.navigationController pushViewController:latte animated:YES];
     }

}

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{
    [self tableView:tableView didSelectRowAtIndexPath:indexPath];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"CellIdentifier"];
    }

    NSString *cellValue = [contentArray objectAtIndex:indexPath.row];
    cell.textLabel.text = cellValue;

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.textLabel.font = [UIFont systemFontOfSize:16];
    cell.detailTextLabel.text = @"Hot and ready";

    UIImage *image = [UIImage imageNamed:@"coffeeButton.png"];
    cell.imageView.image = image;

    cell.textLabel.text = [contentArray objectAtIndex:indexPath.row];
    return cell;
}
11
flyers

これを少し複雑にしすぎたと思います。心配しないでください、私は同じことをよくします。

まず、tableView:didSelectRowAtIndexPath:内からtableView:accessoryButtonTappedForRowAtIndexPath:を送信することにより、2つの方法に違いはありません。セルまたはそのアクセサリボタンをタップすると、同じアクションが実行されます。セル自体をタップするのとは異なるアクションを実行するためにアクセサリボタンが必要ない場合は、それを削除します。

次に、ストーリーボードを使用している場合は、ViewControllerにalloc/initWithNibを割り当てる必要はありません。代わりに、セグエを使用してください。ストーリーボードを介してこれを行う場合は、プログラムでviewControllerをnavigationControllerにプッシュする必要もありません。

最初にストーリーボードを作成します。

  1. UITableViewControllerをドラッグします。右側のインスペクターペインを使用して、ドラッグアウトしたUITableViewControllerのクラスを独自の「DetailViewController」に設定してください。
  2. 次に、このコントローラーを選択し、メニューを使用して「エディター-> 埋め込み-> ナビゲーションコントローラー "」を選択します。
  3. 次に、3つの汎用UIViewControllerをドラッグします。 1つのクラスを「LatteViewController」に、別のクラスを「EspressoViewController」に、3番目のクラスを「CapicinoViewController」に設定します(インスペクターを再度使用します)。
  4. Control + UITableViewControllerからこれらの各viewControllerにドラッグし、Pushを選択します。
  5. UITableViewControllerとこれらの各viewControllerの間の矢印にある小さな円をクリックします。インスペクター(右側)で、識別子フィールドに各セグエに一意の名前を付けます。コードでは、この名前を覚えておく必要があります。私はそれらを「EspressoSegue」、「LatteSegue」、「CapicinoSegue」と名付けます。以下のコードでその理由がわかります。

次に、UITableViewControllerに次のコードを配置します。

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

//Build a segue string based on the selected cell
NSString *segueString = [NSString stringWithFormat:@"%@Segue",
                        [contentArray objectAtIndex:indexPath.row]];
//Since contentArray is an array of strings, we can use it to build a unique 
//identifier for each segue.

//Perform a segue.
[self performSegueWithIdentifier:segueString
                          sender:[contentArray objectAtIndex:indexPath.row]];
}

残りをどのように実装するかはあなた次第です。 UITableViewControllerにprepareForSegue:sender:を実装してから、そのメソッドを使用してsegue.destinationViewControllerに情報を送信することをお勧めします。

セグエの送信者としてcontentArrayから文字列を渡したことに注意してください。あなたは好きなものを渡すことができます。セルを識別する文字列は、渡すのに最も論理的な情報のように見えますが、選択はあなた次第です。

上に投稿されたコードはあなたのためにナビゲーションを実行するはずです。

17
JoeBob_OH