11

Bir Görünüm Denetleyicisinin içinde bir tablo görünümü var. Tüm bilgilerimi tablo görünümünde doldurabilirim. Ancak detay görüntülerini ayarlamak için biraz kayboldum. Her bir masa hücresinin her ayrıntıya bir segue ihtiyacı olduğuna inanıyorum ama tamamen emin değilim.Xcode Storyboard'u Kullanarak Bir Tablo Görünüm Hücresinden Detay Görünümüne Aktarma

İşte kodum. Tablo görünümünden seyahate ulaşmak için neyi eksik görüyorum? Kodu:

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

cevap

17

Bunu biraz fazla karmaşık hale düşünüyorum. Merak etme, aynı şeyi sık sık yaparım. İlk olarak, tableView:accessoryButtonTappedForRowAtIndexPath: içinden tableView:didSelectRowAtIndexPath: göndererek iki yöntem arasında fark yoktur. Hücreye dokunmak veya aksesuar düğmesi aynı işlemi gerçekleştirir. Hücrenin kendisine dokunmaktan farklı bir işlem gerçekleştirmek için aksesuar düğmesine ihtiyacınız yoksa, kaldırın.

İkincisi, bir film şeridi kullanıyorsanız, görüntüleme denetleyicilerinize/initWithNib atamanıza gerek yoktur. Bunun yerine, bir segue kullanın.

  1. Drag dışarı UITableViewController: şeridine yoluyla bunu, ayrıca programlı

    sizin NavigationController

    üzerine viewControllers itin öncelikle film şeridi kurmak gerekmez. Sağ taraftaki denetleyici bölmesini kullanarak kendi "DetailViewController" 'a sürüklediğiniz UITableViewController sınıfını ayarladığınızdan emin olun.
  2. O zaman bu denetleyicisi seçmek ve menüler kullanılarak "Editor- yılında>Göm ->Navigasyon Denetleyici" seçin.
  3. Sonraki, üç genel UIViewControllers öğesini sürükleyin. Birini "LatteViewController" 'a, diğerine "EspressoViewController"' a ve üçüncüsü ise "CapicinoViewController" a (tekrar denetçiyi kullanarak) getirin.
  4. UITableViewController öğesinden bu viewControllers denetimlerini denetleyin veya sürükleyin ve PUSH'u seçin.
  5. UITableViewController'ınız ile bu viewControllers öğelerinin arasındaki okdaki küçük daireye tıklayın. Denetçide (sağ tarafta), her segue Tanımlayıcısı alanında benzersiz bir ad verin. Bu ismi kodunuz için hatırlamanız gerekecek. Onlara "EspressoSegue", "LatteSegue" ve "CapicinoSegue" isimleri verirdim. Aşağıdaki kodda neden göreceksiniz.

    - (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]]; 
    } 
    

    gerisi size kalmış nasıl uygulamak:

Sonra UITableViewController aşağıdaki kodu koydu. UITableViewController ürününüze prepareForSegue:sender: kodunu uygulamak ve daha sonra bu yöntemi segue.destinationViewController'a göndermek için kullanabilirsiniz.

İçeriğinizden dizgeyi gönderen olarak dizgeni gönderdiğimi unutmayın. Ne istersen geçebilirsin. Hücreyi tanımlayan dizge geçmek için en mantıklı bilgiler gibi görünüyor, ancak seçim size kalmış.

Yukarıdaki kod, sizin için navigasyonu gerçekleştirmelidir.

İlgili konular