1

我是 iPhone 开发的新手。我现在已经做了几个 android 应用程序,所以我想我会在 iPhone 上试一试。

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

我尝试添加一个新的 viewController 并在我现有的 tableViews 之一中按住 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'”。

感谢到目前为止的评论。:)

4

2 回答 2

1

您需要将 aUINavigationController作为链接到选项卡栏的视图控制器,然后您必须将表链接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;
    }
}
于 2013-03-23T16:35:56.833 回答
1

要按照您的建议进行操作,您将不会从单元格中按 ctrl+单击。

你需要设置 UITableViewDelegate。

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

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

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

于 2013-03-23T16:41:37.513 回答