如何从Storyboard中的表视图调用详细视图

时间:2011-12-15 05:59:17

标签: iphone

我有以下问题。

我创建了一个基于选项卡的应用程序,其中包含三个视图和Viewcontroller。 FirstView(开始屏幕内容),SecondView(详细信息页面),ThirdView(列表项目表)。 (自动设置故事板的连接)。

在第三个视图中,集成了一个表格并且内容显示正常。

现在我想在选择表格中的一行时调用SecondView。

我还尝试在tabBar Controller之外添加一个View来获取Detailview,但这也没有帮助。

我已经尝试了几个教程和论坛提示,但无法使其正常运行。

该类设置为右侧ViewController,标识符设置为detail。

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
DetailViewController *detail = [self.storyboard instantiateViewControllerWithIdentifier:@"detail"];
[self.navigationController pushViewController:detail animated:YES];
detail.label1.text = @"It is working";

}

单击该行时,它变为蓝色,但没有任何反应。没有错误消息,没有。

希望你能提供帮助: - )


好的,我已经尝试过"优化"我的设计。

仍然有基于标签的视图,但是当点击表格中的一行时,应该会出现一个新的(未在故事板中链接)视图来显示所选报价的详细信息。

  1. 我在故事板中创建了一个视图并将其命名为" detailzitat"
  2. 我创建了一个DetailViewController.h / m作为UIViewcontroller类
  3. 我已将自定义类设置为DetailViewController
  4. 我在ThirdViewController.h中导入DetailViewController.h
  5. 我相应地修改了ThirdViewController.h中的didSelectRowAtIndexPath方法。

     -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    DetailViewController *detailVC = [self.storyboard instantiateViewControllerWithIdentifier:@"detailzitat"];
    
    [self.navigationController pushViewController:detailVC animated:YES];
    

    }

    我的DetailViewController.m看起来像

    #import "DetailViewController.h"
    @implementation DetailViewController
    @synthesize label1, labeltext;
    
    - (void)viewDidLoad
    {
    [super viewDidLoad];
    labeltext=@"JUHU";
    label1.text=labeltext;
    }
    

    但是再一次,没有任何反应,除了行变蓝。

    我不明白。如果我在非故事板项目中使用此代码,它正在工作。 我究竟做错了什么 ?在Storyboards中是否有任何关于此组合的教程?尚未找到这种方法。 尝试从网上的不同教程中学习,但最大的问题是,大多数不适用于iOS5,我转移的时候不太好。

    希望得到一些提示:-)

2 个答案:

答案 0 :(得分:1)

您可能想要考虑一下您的设计。如果我正确理解您的描述,用户将在第三个选项卡上,点击表格中的一行,然后您将它们切换回第二个选项卡。导航控制器可能是一种更自然,更不容易混淆的选择。

但无论如何,像这样的东西会有效

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    DetailViewController *detailVC = [self.tabBarController.viewControllers objectAtIndex:1];

    detailVC.label1.text = @"It is working"; // <- this will not work consistently!

    self.tabBarController.selectedViewController = detailVC; 

}

问题在于,当用户在第三个选项卡上时,可能会卸载第二个选项卡视图控制器的视图(例如,由于内存压力)。

用户也可以立即从选项卡1转到选项卡3,因此第二个选项卡的视图甚至根本没有加载。 (要测试上面的代码,你必须选择标签2然后选择标签3.)

如果未加载第二个选项卡的视图层次结构,则label1属性将为nil,因此这将不起作用。更好的策略是在DetailViewController上创建一个类型为NSString *的新@property。并设置那个属性,而不是尝试直接设置label1。

然后在viewWillAppear:的DetailViewController中,您可以根据需要更新标签。当然,您可以确保label1已加载并连接到正确的UILabel。

我希望有所帮助。

答案 1 :(得分:0)

我认为问题出在self.navigationController上。如果您的视图不在导航控制器内,则无效。所以你要做的是在那里创建一个新的导航控制器对象,然后用它来显示你的细节视图。