【问题标题】:iPhone Storyboard NavigationiPhone 故事板导航
【发布时间】:2013-03-13 09:47:28
【问题描述】:

我是 iPhone 开发的新手。我现在已经做了几个安卓应用,所以想试试 iPhone。

但是,我真的发现故事板导航是违反直觉的。我创建了一个基本的选项卡式应用程序,它有 2 个屏幕,两个屏幕都包含一个显示各种数据位的表格视图。当用户单击表格的单元格时,我希望它打开一个新屏幕。简单的?显然不是。

我尝试添加一个新的 viewController 并按住 ctrl 单击从根选项卡式视图控制器链接的现有 tableViews 中的一个表格单元格,以将 seague 添加到新控制器。在模拟器中单击单元格无效。

我尝试将新控制器与自定义类链接,以查看这是否是我失败的地方,但即使我创建了一个继承自 UIViewController 的新 Objective-C 类,它也不会出现在下拉列表中盒子。

除非我误解了视图调用的层次结构应该如何工作?

任何帮助表示赞赏!


编辑:

好的,所以根据以下建议,我已经设法走得更远,但我仍然不完全在那里。我为每个选项卡视图选项添加了导航控制器。然后我 ctrl 单击单元格行以链接到我的新 webview 控制器,选择要推送的选择 seague 集。我 ctrl-clicked webview 到它的控制器,使其成为一个出口委托,并将以下代码添加到该行:

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

    if (_webViewController == nil)
    {
        self.webViewController = [[[RSSWebViewController alloc]     initWithNibName:@"WebViewController" bundle:[NSBundle mainBundle]] autorelease];
    }
    RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
    _webViewController.entry = entry;
    [self.navigationController pushViewController:_webViewController animated:YES];
}

我还补充了:

@property (retain, nonatomic) IBOutlet UIWebView *webView; 

到新的视图控制器头文件。当我在模拟器中单击一行时,它会引发以下异常:

2013-03-23 17:21:17.241 RSS[1330:c07] * 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法在捆绑包中加载 NIB:'NSBundle 与名称'WebViewController''。

感谢到目前为止的 cmets 伙计们。 :)

【问题讨论】:

  • 所以,1) 这与 OS X 无关(UI 前缀的类是 iOS,NS 前缀的类(大部分)是 OS X),2) Xcode 是 IDE,而不是语言.
  • 抱歉,如果我标记错了!
  • 你应该发布你的didSSelectRowAtIndepxPath方法。
  • 嗨,迈克,我没有。这是我的问题吗?
  • @codafi 在这种情况下我会说 Xcode 是一个有效的标签 - 你还能在哪里编辑故事板?问题是关于在 Xcode 中编辑故事板 - 等待它 - Xcode,以及其中的界面存在问题。

标签: iphone ios storyboard


【解决方案1】:

您需要有一个UINavigationController 作为链接到选项卡栏的视图控制器,然后您必须将UINavigationController 链接到当前控制器,表作为根视图控制器,然后将单元格链接到另一个带有 push segue 的视图控制器。因此,每个选项卡都有一个导航控制器。导航控制器使它能够“推送”,否则什么也不会发生,因为它管理视图控制器的堆栈,因为它们被推送和弹出以及执行它们所需的动画。我刚开始的时候也遇到过这个问题。

除非您的单元格都是静态的,否则您可能需要将信息从当前视图控制器传输到新视图控制器,例如选择了哪个项目,以便您可以告诉下一个视图控制器要显示什么。一种方法是让下一个视图控制器成为具有属性的自定义类:@property (strong, nonatomic) NSString* message;,然后在具有推送 segue 的视图控制器中,现在可以在下一个视图控制器被推送之前告诉它。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"your-segue-name"]) // The identifier in the Storyboard for segue (click on the segue)
    {
        // Sender will be cell
        NSString* message = [NSString stringWithFormat:@"cell %d!", [[self.tableView indexPathForCell:sender] row]];
        YourViewControllerClass* destination = [segue destinationViewController];                                                 
        destination.message = message;
    }
}

【讨论】:

  • 嗨 Ric - 我认为这对我遇到的问题是有道理的。正如你所说,我将尝试将主视图拉到子导航控制器中,然后再次尝试链接。非常感激。 :)
  • 干杯瑞克。这帮助我解决了它。我还需要添加: [self performSegueWithIdentifier:@"SelectPlace" sender:[self.tableView cellForRowAtIndexPath:indexPath]];进入我的表格单元格上的点击事件。
  • 不错。是的,如果 segue 是从视图控制器绘制到视图控制器,那么您必须说明在选择单元格时要执行哪一个。请注意,您也可以让发件人是任何东西(因为它是id 又名Object),因此您可以传递indexPath,然后重构prepareForSegue 以知道发件人是NSIndexPath,然后使用[((NSIndexPath*)sender) row].
【解决方案2】:

按照您的建议,您将不会按 ctrl+单击单元格。

你需要设置 UITableViewDelegate。

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/Reference/Reference.html#//apple_ref/doc/uid/TP40006942

然后,正如上面 Mike D 所说,您需要使用 didSelectRowAtIndexPath。

这应该为您指明正确的方向。当我在电脑上(现在在手机上)时,我会回来查看,如果您的问题没有解决,我可以更深入地解释。

【讨论】:

  • 谢谢罗格。现在都整理好了。 :)
  • 酷,很高兴你把它整理好了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2017-02-08
  • 2018-12-21
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多