故事板和编程视图

时间:2013-05-09 18:17:57

标签: ios uiview storyboard xib

我完全迷失在这个问题上。我一直在使用故事板,我已经创建了一个带有tableviews和一些东西的导航控制器。 tableview的每一行都有Services,我需要为每个服务创建一个详细信息视图。

有很多服务,所以我无法在故事板中创建它们。我们的想法是从Web服务下载Services(参数数量,每个参数的类型等等),并根据需要添加为Service的文本字段/按钮。

所以,我的问题和疑问是:

1)我可以通过编程方式组合故事板和视图吗?当我在NewView中创建MyTableviewClass时,我应该使用prepareforsegue方法吗?如何在不丢失导航控制器的情况下在屏幕上显示它?这就是我所拥有的(它不起作用:它告诉我没有名为'Service1'的segue):

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

if ([[segue identifier] isEqualToString:@"NextLevel"]) {
    [segue.destinationViewController setActualNodo:[actualNodo getSonAtIndex:indexPath.row]];
} else if ([[segue identifier] isEqualToString:@"Service1"]) {
    CGRect bounds = self.view.bounds;
    UIView *myview  = [[UIView alloc] initWithFrame:bounds];
    [myview setBackgroundColor: [UIColor redColor]];
    [self.view addSubview:myview];
    [self.view bringSubviewToFront:myview]; }

欢迎任何书籍或参考书,但我找不到类似的东西。这在iOS中是非常复杂的吗?我在Java中做过类似的事情。我已经阅读了有关使用XIB动态生成接口的信息,但是,真诚地,我不知道它是什么。 谢谢大家。

3 个答案:

答案 0 :(得分:2)

是的,您可以使用视图创建StoryBoard,然后以编程方式向其添加视图。

您不应该尝试在prepareForSegue方法中创建视图。这确实应该用于将对象传递给另一个ViewController

我会向你推荐这个。返回到您的StoryBoard并创建一个新的UIViewController场景。单击您的第一个场景,然后CTRL拖动到新场景。接下来,单击您的segue并为其命名。

第1步:

创建一个名为 ServicesViewController 的新类,并确保它是`UIViewController的子类:

**enter image description here**

第2步:

返回StoryBoard并点击场景以便选中它。接下来,点击Files Owner,最后点击课程信息按钮(第三个按钮),最后选择刚刚创建的ServiceViewController课程。

enter image description here

第3步:

回到ServicesViewController方法中的didSelectRowAtIndex,请致电您的seque:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"YOUR_SEGUE_NAME" sender:nil];
}

目前,请清除prepareForSegue方法中的所有代码,然后先进行转换。

答案 1 :(得分:2)

除了Flea的回答,如果您需要保留导航控制器,只需通过控制从表视图控制器的文件所有者图标(视图控制器视图下的黄色框)拖动,在故事板中创建推送segue您添加到故事板的ServiceViewController,这应该显示一个弹出窗口,您可以在其中选择“推”作为segue的类型。接下来,选择segue并在属性检查器中(第四个按钮,快照中的按钮旁边)和“标识符”文本字段中键入segue的唯一标识符,例如serviceSegue

此时,使用跳蚤的代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     [self performSegueWithIdentifier:@"serviceSegue" sender:nil];
}

在您发布的代码中:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

    if ([[segue identifier] isEqualToString:@"serviceSegue"]) 
        [segue.destinationViewController setActualNodo:[actualNodo getSonAtIndex:indexPath.row]];
}

我不确定你要对其他segue“Service1”做什么,但如果你想改变TableViewController的视图,segues就不是这样做的了。如果有的话,你应该在didSelectRowAtIndexPath方法中进行,具体取决于所选的行:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     if (You want to transition to other view controller)
         [self performSegueWithIdentifier:@"serviceSegue" sender:nil];
     else
         Change your view here.
}

我希望这有帮助!

答案 2 :(得分:1)

听起来你在tableView中只有多个单元格。您可以简单地创建具有不同标识符的不同单元格,而不是使用segues,并根据在您的Web服务中填充的服务数组中检测到的服务来显示或隐藏它们。