2013-05-09 102 views
1

我完全失去了这个问题。我一直在使用故事板,我创建了一个带有桌面视图和一些东西的导航控制器。在tableview的每一行中有Services,我需要为每个服务创建一个详细视图。故事板和编程视图

有很多服务,所以我不能在故事板中创建它们。这个想法是从网络服务(参数数量,每个类型等等)下载Services,并作为适当的文本域/按钮添加到Service

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

1)我可以结合故事板和视图编程?当我在MyTableviewClass中创建NewView时,我应该在我的prepareforsegue方法中执行此操作吗?如何在不丢失导航控制器的情况下在屏幕上显示它?这是我有什么(它不工作:它给我说,没有赛格瑞名为“服务1”):

- (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,但是,真诚地,我不知道它是什么.. 感谢所有。

回答

2

是的,您可以创建一个带有视图的StoryBoard,然后以编程方式向其添加视图。

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

我会建议你这样做。回到你的StoryBoard并创建一个新的UIViewController场景。点击你的第一个场景,然后拖动到新的场景。接下来,点击你的segue并给它一个名字。

第1步:

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

**enter image description here**

第2步:

围棋回到你的StoryBoard并点击场景以便它被选中。接下来,点击Files Owner,最后点击班级信息按钮(第三个按钮),最后选择您刚创建的ServiceViewController班级。

enter image description here

第3步:

回到你ServicesViewControllerdidSelectRowAtIndex方法调用你塞克:

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

现在,在您的prepareForSegue方法清理掉所有的代码和只是先让它转换下来。

+0

起初感谢您的回答。因此,我可以在故事板中创建一个新的ViewController(空),将其与我的'ServiceView'类关联,并在ViewDidLoad中以编程方式生成接口,对吧? – Sergiodiaz53 2013-05-10 08:29:26

+0

我更新了更详细的答案。我希望这可以帮助你更多!忽略场景中的UImageView,这是我的项目中的一个。它应该是一个空白的白色视图。 – Flea 2013-05-10 14:41:16

+0

如何在UIButton按钮上以编程方式添加按钮到故事板视图? – 2014-04-10 13:27:48

1

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

+0

感谢您的帮助,MarkM,但我的问题是我如何能够动态地生成接口,一旦我有我的tableview工作。无论如何,我认为我可以继续与上面的答案。 – Sergiodiaz53 2013-05-10 08:32:35

2

除了Flea的回答,如果您需要保留导航控制器,只需通过控制从视图控制器的视图控制器视图中的文件所有者图标(视图控制器视图下方的黄色框)拖动,在故事板中创建一个推动区域到您添加到故事板的ServiceViewController,这应显示一个弹出窗口,您可以在其中选择“push”作为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做“服务1 “,但如果你想改变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. 
} 

我希望这有助于!