当前位置: 首页 > 科技观察

使用Storyboard进行开发的10个技巧

时间:2023-03-15 22:34:09 科技观察

在这里,我将重点关注10件事,而不会详细介绍如何使用Storyboard创建内容。这些提示没有特别的顺序,但它们可能会帮助您沿着这条路走下去。故事板是我花最多时间研究的领域之一。我真的很喜欢可视化编程。只需将项目拖入画布,更新位置信息,并设置一些描述信息,您就创建了一个用户界面,而无需编写任何代码。这一点非常重要,因为用户界面的代码很快就会在您的代码中变得一团糟。当我参与一个新项目时,我做的第一件事就是找到其中的Storyboard。这是获得程序总体框架概览的重要位置。如果不使用可视化编辑器,需要手动操作查找工作进度。你花费大量时间在代码中来回穿梭,你只能粗略地了解一个给定的视图是怎么回事。您可以明确引用设计文件或运行应用程序并导航到所需区域,但我宁愿避免这种情况。***,在某些情况下,调整界面组件会变成一个乏味的过程。您不断地编译和运行应用程序以验证它是否在正确的位置,而不是通过Storyboard进行快速调整。看,创建一个像右边那样的简单界面就需要很多代码,而且我什至没有编写任何自动布局代码来帮助定位。我知道会有顽固的代码书呆子。但我仍然不希望这让我的代码膨胀,这真的很烦人。别弄错我的意思。对于初学者来说,这样做的价值在于了解如何通过代码创建用户界面。通过给定的用户界面,您对它可以做什么有一个大概的了解。而不是查阅文档。该列表可能适合一个片段,但没关系,您不需要在情节提要中构建整个程序。这些可以分为几个故事板。假设有一个管理面板、一个设置面板和一个主面板。当你的程序扩展时,它可以为你节省大量的精力。在团队中工作时与故事板交互也更容易,并且可以更快地找到您需要的故事板。什么是exitsegue以及如何使用它首先,让我谈谈什么是segue。假设您当前的故事板中有两个场景,第一个场景有一个按钮。当您右键单击场景1中的按钮并将其拖动到场景2时,您正在创建一个转场。现在假设我们模态地选择现在。此模态表示这是用户首先关注的场景。没有简单的方法可以返回到第一个场景,如果您将一个场景推到导航堆栈上,您可能已经看到了这一点。我们可以创建一个委托来通知第一个控制器我们已经完成了。但这有点繁琐,我们还可以向第一个控制器发送通知,但这有点大材小用。这是一个使用退出转场的机会,退出转场就像转场一样工作,只是它返回到执行UIStoryboardSegue操作的位置。这就是关键!退出segue可以通过您创建的segue一直导航回来,并且无论segue在何处创建,都可以找到退出segue。查看下面的完整地图结构。如果您只是右击按钮的退出转场指示器,您将看不到任何东西。它需要检测您在目标控制器中创建UIStoryboardSegue操作的方法(由绿色箭头指向)。例如:@IBActionfuncunwindToSceneA(unwindSegue:UIStoryboardSegue){//besuretogiveyourunwindsegueanidentifiersoyouknowwherewe'recomingfrom}Storyboard(故事板)跳转你不需要在故事板中画一个漂亮的segue到你想去的地方。您只需初始化故事板并获得您想要呈现的控制器。一旦有了控制器,就可以调用必要的显示方法。varstoryboard:UIStoryboard=UIStoryboard(name:"Settings",bundle:nil)varmodal:UIViewController=storyboard.instantiateViewControllerWithIdentifier("settingsStoryboardId")asUIViewControllerself.presentViewController(modal,animated:true,completion:nil)/*readifyou'refetchingacontrollerinthesamestorybo'*thenyoucanskipinitializing复制代码anewUIStoryboardobject.*/varmodal:UIViewController=self.storyboard?.instantiateViewControllerWithIdentifier("customStoryboardId")asUIViewControllerself.presentViewController(modal,animated:true,completion:nil)previeweditorifittakesalltimetobuildandrunapp观察用户界面是否调整到你想要的结果是繁琐的。在处理自动布局时尤其如此。现在打开预览编辑器,您可以修改视图并观察它是如何变化的。您也可以在左下角的辅助编辑器面板上按+按钮以预览多种屏幕尺寸的界面。#p#让你的手指休息一下如果你有一个按钮需要连接到源代码中,你可以右键单击并拖一条线到源文件中为你生成一个插座。此外,对于给定的事件,您可以通过单击并拖动到您的源文件来生成一个动作。以上操作的最终结果。那么,为什么需要做这些操作呢?这么说吧,最明显的就是行动。如果你不创建一个@IBAction函数,当你按下按钮时什么也不会发生。您可以假设您需要添加一些代码来更改最初在UIImageView中设置的图像。为了更改此图像,我们需要一个@IBOutlet以便我们可以访问它。避免极其复杂的控制器即使您的控制器可以管理大量子视图,您也冒着逐层添加视图的风险,这将彻底破坏一切。很快您就会发现您已经偏离了使用可视化编辑器的目的——提供清晰的视图层次结构。如果你有一个复杂的视图结构,那么是时候考虑这些设置了。您可以使用xib,也可以将容器视图对象添加到您的场景,并在需要时将其隐藏。通常我使用xibs,但在某些情况下使用容器视图对象。当你添加一个xib时,你也添加了一个源文件,你将使用它来初始化xib。例如,我们创建了ExampleView.xib和一个不错的场景。要加载此视图,我们需要创建ExampleView.swift并初始化xib。importUIKitclassExampleView:UIView{//normalinitializationoverrideinit(frame:CGRect){super.init(frame:frame)self.addExampleViewSubview()}//如果我们使用这个classinastoryboard,forexamplerequiredinit(coderaDecoder:NSCoder){super.init(coder:aDecoder)ViewSubviewself.addExample()}funcaddExampleViewSubview(){varxib=NSBundle.mainBundle().loadNibNamed("ExampleView",owner:self,options:nil)varview:UIView=xib.firstasUIViewview.frame=self.frameself.addSubview(view)}}placeholderManipulatingConstraints这适用于那些喜欢混合代码和情节提要操纵约束的人。尽管我个人尽量避免在代码中编写约束,但它确实适用于不属于故事板的视图。如果您尝试在代码中创建约束并需要与情节提要中的UI交互,这可能是一种非常可怕的体验。不过不要害怕,您可以轻松地告诉Xcode这个特定的约束是一个占位符。这意味着在构建和运行应用程序时将忽略它。您可能需要更改使用情节提要加载的场景的默认视图控制器。在早期版本的Xcode中,您可以选择一个场景并选择**IsInitialViewController**。最新版本的Xcode已更改。现在你需要搜索对象库,找到**StoryboardEntryPoint**,然后你可以拖放到你想要的场景。一次只能激活其中一个,因此您可以将其拖到您想要的任何控制器中。你为什么要担心入口点的变化?就个人而言,我用它来测试不同的控制器,我不想创建大量按钮来进入控制器。如果您只是更新故事板的入口点,它将立即加载。自定义Segue过渡效果如果您选择一个segue,您可能已经注意到它有一些预加载的过渡效果,例如垂直叠加、水平翻转、淡入淡出和部分卷曲。如果您想要更多自定义效果怎么办?在这种情况下,您需要创建自定义UIStoryboardSegue。举一个简单的例子,创建一个新的Swift文件并将其命名为**CustomSegue**。当我们的segue执行时(点击上面的按钮),下面的代码也会被执行。importUIKitclassCustomSegue:UIStoryboardSegue{varstartingPoint:CGPoint=CGPoint(x:0,y:0)overridefuncperform(){varsource=self.sourceViewControllerasUIViewControllervardestination=self.destinationViewControllerasUIViewController//Addthedestinationviewasassubview(temporarily)source.view?.addSubview(destination.view)//Setthestartscaledestination.view.transform=CGAffineTransformMakeScale(0.05,0.05)//OriginalcenterpointvaroriginalCenter=destination.view.centerdestination.view.center=self.startingPointUIView.animateWithDuration(0.225,delay:0.0,options:UIViewAnimationOptions.CurveEaseOut,animations:{(>voidindestination.view.transform=CGAffineTransformMakeScale(1.0,1.0)destination.view.center=originalCenter}){(finished)->Voidindestination.view.removeFromSuperview()source.presentViewController(destination,animated:false,completion:nil)}}}按下按钮时,目标视图将从我们设置的起始位置展开。在这种情况下,我将起始位置设置为中心位置场景1(源场景)中的按钮。overridefuncprepareForSegue(segue:UIStoryboardSegue,sender:AnyObject?){letcustom=segueasCustomSeguecustom.startingPoint=self.nextImage.center}在故事板文件中我们选择从场景1到场景2的segue。将Segue更改为Custom,然后将Segue类导入到匹配我们刚刚创建的CustomSegue。避免源代码控制的噩梦对于团队中的那些人来说,虽然他们逐渐变得更好,但故事板在源代码控制方面仍然是一个很大的痛处。这就是为什么你应该把故事板分??成几个。如果可以避免这种情况,请确保一次只有一个人在制作故事板。这避免了当其他人将对情节提要的更改提交到项目中时发生冲突。即使不容易避免,也要准备好防止这种情况发生。这可能就是团队和小公司不想使用故事板的原因***。尽管在与我的团队共享故事板时很可能会导致源代码控制冲突,但我仍然觉得速度和效率比修复因冲突而烦人的补丁更重要。在大多数情况下,我会确保其他人避免同时与我打交道。然而,它仍然一次又一次地发生。以下是我处理冲突的方式:(***防线)首先积极避免它。在处理故事板时,我经常提前承诺并向也在处理故事板的其他人打招呼。与其他人一起工作时,尽量保持小任务并互相帮助。不要推送单一的大更新。如果遇到冲突,我会浏览比较工具[Kaleidoscope](http://www.kaleidoscopeapp.com/)。了解故事板的工作原理确实需要一些经验。如果你还没有看到它,现在是时候了。右键单击Storyboard>openas>sourcecode以查看控制器区域(包括连接信息)的布局方式。(坏情况)我弄清楚谁做了最新的更改,谁收到了这些更改,覆盖了其他什么,我们将恢复这些更改。我做过一些大项目。尽管这些合并问题通常不会严重到diff工具无法恢复的程度。但是你可以获得更多的经验。我怎么强调***点都不为过。积极主动很重要。了解您的团队是什么样的。如果你有一个非常复杂的故事板,把它分成不同的区域。Takeawaystoryboards非常有用,特别是对于非常直观的东西。它还可以在原型制作时为您提供不错的速度优势。无需担心代码,您可以快速将元素放置到位,连接它们,然后从驱动界面的逻辑开始。