故事板和程序化视图
Posted
技术标签:
【中文标题】故事板和程序化视图【英文标题】:Storyboards and programmatically views 【发布时间】:2013-05-09 18:17:57 【问题描述】:我完全迷失在这个问题上。我一直在使用故事板,我创建了一个带有表格视图和一些东西的导航控制器。表格视图的每一行都有Services
,我需要为每个服务创建一个详细视图。
有很多服务,所以我无法在情节提要中创建它们。这个想法是从网络服务下载Services
(参数数量,每个类型等),并根据需要添加为文本字段/按钮到Service
。
所以,我的问题和疑问是:
1) 我可以以编程方式组合故事板和视图吗?当我在MyTableviewClass
中创建NewView
时,我应该在我的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 动态生成接口的信息,但是说实话,我不知道它是什么.. 谢谢大家。
【问题讨论】:
【参考方案1】:是的,您可以创建一个带有视图的StoryBoard
,然后以编程方式向其中添加视图。
您不应该尝试在 prepareForSegue
方法中创建视图。这确实应该用于将对象传递给另一个 ViewController
。
我会向你推荐这个。回到你的StoryBoard
并创建一个新的 UIViewController 场景。单击您的第一个场景并CTRL
拖动到新场景。接下来,单击您的 segue 并为其命名。
第 1 步:
创建一个名为 ServicesViewController 的新类,并确保它是 `UIViewController: 的子类:
第 2 步:
返回您的StoryBoard
并单击场景以将其选中。接下来,点击Files Owner
,最后点击类信息按钮(第三个按钮),最后选择你刚刚创建的ServiceViewController
类。
第 3 步:
回到你的ServicesViewController
,在didSelectRowAtIndex
方法中调用你的序列:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
[self performSegueWithIdentifier:@"YOUR_SEGUE_NAME" sender:nil];
现在,清除您的 prepareForSegue
方法中的所有代码,然后先关闭转换。
【讨论】:
首先感谢您的回答。所以,我可以在我的故事板中创建一个新的 ViewController(空),将它与我的“ServiceView”类相关联,并在 ViewDidLoad 中以编程方式生成界面,对吧? 我更详细地更新了我的答案。我希望这对你有更多帮助!忽略现场的 UImageView,它是我项目中的一个,它应该是你的一个空白视图。 如何在 UIButton 按下时以编程方式将按钮添加到情节提要视图?【参考方案2】:除了 Flea 的回答之外,如果您需要保留导航控制器,只需通过从表格视图控制器的文件所有者图标(视图控制器视图下方的黄色框)拖动控件来在情节提要中创建推送 segue 到您添加到情节提要的 ServiceViewController,这应该会显示一个弹出窗口,您可以在其中选择“push”作为转场的类型。接下来,选择 segue 并在属性检查器中(第四个按钮,在快照中的那个旁边)并在“标识符”文本字段中输入您的 segue 的唯一标识符,例如 serviceSegue
。
此时,使用 Flea 的代码:
- (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.
我希望这会有所帮助!
【讨论】:
【参考方案3】:听起来您在 tableView 中只有多个单元格。除了使用 segue,您可以简单地创建具有不同标识符的不同单元格,并根据从您的 Web 服务填充的服务数组中检测到的服务来显示或隐藏它们。
【讨论】:
感谢您的帮助,MarkM,但我的问题是如何在我的 tableview 工作后动态生成界面。无论如何,我认为我可以继续使用上面的答案。以上是关于故事板和程序化视图的主要内容,如果未能解决你的问题,请参考以下文章
通过故事板和自动布局完全使用 uiscrollview 水平滚动