11

Mam widok tabeli wewnątrz kontrolera widoku. Mogę zapełnić wszystkie moje informacje w widoku tabeli. Jednak jestem trochę zagubiony przy ustawianiu widoków szczegółów. Wierzę, że każda komórka tabeli potrzebuje przejścia do każdego widoku szczegółów, ale nie jest całkowicie pewna.Przesyłanie do widoku szczegółów z komórki widoku tabeli przy użyciu Xcode Storyboard

Oto mój kod. Czego mi brakuje, aby wykonać przejście z widoku tabeli do widoków szczegółów? Kod:

.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; 
} 

Odpowiedz

17

Myślę, że zrobiłeś to trochę zbyt skomplikowane. Nie martw się, często robię to samo.

Po pierwsze, wysyłając tableView:didSelectRowAtIndexPath: od tableView:accessoryButtonTappedForRowAtIndexPath: nie ma różnicy między tymi dwoma metodami. Stuknięcie w komórkę lub przycisk akcesoriów wykonuje tę samą akcję. Jeśli nie potrzebujesz przycisku akcesoriów, aby wykonać inną akcję niż stukając samą komórkę, usuń ją.

Po drugie, jeśli używasz storyboardu, nie musisz przydzielać/initWithNib dla kontrolerów widoku. Zamiast tego użyj segue. Jeśli zrobisz to za pomocą serii ujęć, także nie trzeba programowo naciskać viewControllers na swojej navigationController

Zbuduj swój pierwszy storyboard:

  1. przeciągnąć UITableViewController. Upewnij się, że ustawiłeś klasę kontrolera UITableViewController, który przeciągnąłeś do swojego własnego "DetailViewController", używając panelu kontrolnego po prawej stronie.
  2. Następnie wybierz ten kontroler i korzystania z menu wybrać "Edytor ->osadzić w ->Navigation Controller".
  3. Następnie przeciągnij trzy ogólne kontrolery UIViewController. Ustaw klasę jeden na "LatteViewController", drugi na "EspressoViewController", a trzeci na "CapicinoViewController" (ponownie używając inspektora).
  4. Sterowanie + przeciągnij z kontrolki UITableViewController na każdy z tych kontrolerów viewController i wybierz: PUSH.
  5. Kliknij małe kółko na strzałce pomiędzy kontrolerem UITableViewController i każdym z tych kontrolerów viewController. W inspektorze (po prawej stronie) nadaj każdemu segmentowi unikatową nazwę w polu Identifier. Będziesz musiał zapamiętać tę nazwę dla swojego kodu. Nazwałbym je "EspressoSegue", "LatteSegue" i "CapicinoSegue". Zobaczysz, dlaczego w poniższym kodzie.

Następnie umieścić następujący kod w swoim 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]]; 
} 

Jak wdrożyć reszta należy do Ciebie. Możesz zaimplementować prepareForSegue:sender: w swoim UITableViewController, a następnie użyć tej metody przesłać informacje do segue.destinationViewController.

Należy zauważyć, że przekazałem ciąg z obiektu contentArray jako nadawcę dla segue. Możesz przekazać, co chcesz. Łańcuch identyfikujący komórkę wydaje się najbardziej logiczną informacją do przekazania, ale wybór należy do Ciebie.

Powyższy kod powinien wykonać nawigację.

Powiązane problemy