使用Xcode Storyboard从表视图单元格推送到详细信息视图 [英] Pushing to a Detail View from a Table View Cell using Xcode Storyboard

查看:118
本文介绍了使用Xcode Storyboard从表视图单元格推送到详细信息视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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

  .h 

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

@property(强,非原子)IBOutlet UITableView * myTable;

.m


- (void)viewDidLoad
{
contentArray = [[NSMutableArray alloc] init];
[contentArray addObject:@Espresso];
[contentArray addObject:@Latte];
[contentArray addObject:@Capicino];
[super viewDidLoad];
//加载视图后进行任何其他设置。
}

//表信息
- (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 :是];

if([[contentArray objectAtIndex:indexPath.row] isEqualToString:@EspressoViewController])
{
EspressoViewController * espresso = [[EspressoViewController alloc] initWithNibName:@EspressoViewController 捆绑:无;
[self.navigationController pushViewController:espresso animated:YES];
}
else if([[contentArray objectAtIndex:indexPath.row] isEqualToString:@Latte])
{
LatteViewController * latte = [[LatteViewController alloc] initWithNibName:@ Latte捆绑: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 = @细胞;

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 = @热和准备好;

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

cell.textLabel.text = [contentArray objectAtIndex:indexPath.row];
返回单元格;
}


解决方案

我认为你做了这个有点太复杂了。别担心,我经常做同样的事情。



首先,从内部发送 tableView:didSelectRowAtIndexPath: tableView:accessoryButtonTappedForRowAtIndexPath:这两种方法没有区别。点击单元格或其附件按钮执行相同的操作。如果您不需要附件按钮执行与单击本身不同的操作,请将其删除。



其次,如果您使用的是故事板,则执行此操作不需要为视图控制器分配/ 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基于所选单元格的segue字符串
NSString * segueString = [NSString stringWithFormat:@%@ Segue,
[contentArray objectAtIndex:indexPath.row]];
//由于contentArray是一个字符串数组,我们可以使用它为每个segue构建一个唯一的
//标识符。

//执行segue。
[self performSegueWithIdentifier:segueString
sender:[contentArray objectAtIndex:indexPath.row]];
}

如何实施其余部分取决于您。您可能希望在UITableViewController中实现 prepareForSegue:sender:,然后使用该方法将信息发送到 segue.destinationViewController



请注意,我从您的contentArray传递了字符串作为segue的发件人。你可以传递任何你喜欢的东西。标识单元格的字符串似乎是最合理的信息,但选择取决于您。



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

I have a table view inside a View Controller. I can populate all my information inside the table view. However I am a bit lost for setting up the detail views. I believe each table cell needs a segue to a each detail view but not completely sure.

Here is my code. What am I missing to accomplish the segue from the table view to the detail views? Code:

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

解决方案

I think you made this a little too complicated. Don't worry, I do the same thing often.

First, by sending tableView:didSelectRowAtIndexPath: from within tableView:accessoryButtonTappedForRowAtIndexPath: there is no difference between the two methods. Tapping the cell, or it's accessory button performs the same action. If you don't need the accessory button to perform a different action than tapping the cell itself, remove it.

Second, if you're using a storyboard, you do not need to alloc/initWithNib for your view controllers. Instead, use a segue. If you do this through the storyboard, you also don't need to programmatically push viewControllers onto your navigationController

Build your storyboard first:

  1. Drag out a UITableViewController. Make sure you set the class of the UITableViewController you dragged out to your own "DetailViewController" using the inspector pane on the right side.
  2. Then select this controller and using the menus choose "Editor->Embed In->Navigation Controller".
  3. Next, drag out three generic UIViewControllers. Set the class of one to "LatteViewController", another to "EspressoViewController", and a third to "CapicinoViewController" (using the inspector again).
  4. Control+drag from the UITableViewController over to each of these viewControllers and choose PUSH.
  5. Click on the little circle that's on the arrow between your UITableViewController and each of these viewControllers. In the inspector (on the right side), give each segue a unique name in the Identifier field. You will need to remember this name for your code. I would name them "EspressoSegue", "LatteSegue", and "CapicinoSegue". You'll see why in the code below.

Then put the following code in your 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]];
}

How you implement the rest is up to you. You may want to implement prepareForSegue:sender: in your UITableViewController and then use that method send information over to segue.destinationViewController.

Note that I passed the string from your contentArray as the sender for the segue. You can pass whatever you like. The string that identifies the cell seems like the most logical information to pass, but the choice is up to you.

The code posted above should perform the navigation for you.

这篇关于使用Xcode Storyboard从表视图单元格推送到详细信息视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆