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

我在View Controller中有一个表视图。 我可以在表视图中填充所有信息。 但是我在设置详细视图时有点迷失。 我相信每个表格单元格需要一个segue到每个细节视图但不完全确定。

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

.h @interface DetailViewController : UIViewController  { 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; } 

我觉得你这个太复杂了。 别担心,我经常做同样的事情。

首先,通过从tableView:accessoryButtonTappedForRowAtIndexPath:发送tableView:didSelectRowAtIndexPath:两种方法之间没有区别。 点击单元格或其附件按钮执行相同的操作。 如果您不需要配件按钮执行与敲击电池本身不同的操作,请将其取下。

其次,如果您使用的是故事板,则不需要为视图控制器分配/ initWithNib。 相反,使用segue。 如果通过故事板执行此操作,则还无需以编程方式将viewControllers推送到navigationController

首先构建故事板:

  1. 拖出一个UITableViewController。 确保使用右侧的检查器窗格将您拖出的UITableViewController的类设置为您自己的“DetailViewController”。
  2. 然后选择此控制器并使用菜单选择“ 编辑器 – > 嵌入 – > 导航控制器 ”。
  3. 接下来,拖出三个通用的UIViewControllers。 将class 1设置为“LatteViewController”,将另一个设置为“EspressoViewController”,将第三个设置为“CapicinoViewController”(再次使用检查器)。
  4. 控制+从UITableViewController拖动到每个viewControllers并选择PUSH
  5. 单击UITableViewController和每个viewControllers之间箭头上的小圆圈。 在检查器(右侧)中,在“ 标识符”字段中为每个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的发件人。 你可以传递任何你喜欢的东西。 标识单元格的字符串似乎是最合理的信息,但选择取决于您。

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