使用Xcode Storyboard从表视图单元格推送到详细视图

10

我在一个视图控制器中有一个表格视图。我可以在表格视图中填充所有信息。但是,我有些迷失于设置详细视图的过程中。我认为每个表格单元格需要一个segue到每个详细视图,但不完全确定。

这是我的代码。我缺少什么来完成从表格视图到详细视图的segue?

.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;
}
1个回答

17

我认为你把这个问题想得太复杂了。别担心,我也经常这样做。

首先,在tableView:accessoryButtonTappedForRowAtIndexPath:方法中调用tableView:didSelectRowAtIndexPath:方法没有任何区别。点击单元格或其附属按钮执行的操作相同。如果你不需要附属按钮执行与单元格本身点击不同的操作,请将其删除。

其次,如果使用故事板,就不需要为视图控制器分配内存和初始化。而是使用segue。如果在故事板中完成此操作,您还不需要通过编程方式将viewControllers推入navigationController。

首先建立你的故事板:

  1. 拖出一个UITableViewController。确保使用右侧的检查器窗格将您拖出的UITableViewController的类设置为您自己的“DetailViewController”。
  2. 选择此控制器并使用菜单选择“Editor->Embed In->Navigation Controller”。
  3. 然后,拖出三个通用的UIViewControllers。再次使用检查器将一个类设置为“LatteViewController”,另一个类设置为“EspressoViewController”,第三个类设置为“CapicinoViewController”。
  4. 从UITableViewController控件上按住Control键并拖动到每个视图控制器上,选择PUSH
  5. 点击UITableViewController和每个视图控制器之间的箭头上的小圆圈。在检查器中,在标识符字段中为每个segue命名一个独特的名称。您需要记住这个名称以供代码使用。我会将它们命名为“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的字符串作为segue的sender传递。您可以传递任何您喜欢的内容。标识单元格的字符串似乎是传递的最合适信息,但选择取决于您。

上面发布的代码应该为您执行导航操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接