Tag: 故事图板

编写健壮的无字符串Swift代码

在不使用字符串的情况下使用情节提要,Xib和ViewController 您如何避免错误? 显然是因为没有编写任何代码。 但是,还有另一个神秘而又不那么幽默的答案。 通过不进行硬编码。 iOS最糟糕的功能之一是对字符串的过度依赖。 难怪如此轻视键值观察(KVO),是的,甚至包括使用故事板和视图控制器实例化。 随着Swift的发展,Apple试图减少字符串的使用,例如在选择器中。 例如,在Swift 2.2选择器使用之前,如下所示: button.addTarget(self, action: Selector(“buttonTapped”), for: .touchUpInside) 。 然后,他们改进为: button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside) 。 但是仍然非常依赖,这带来了很大的潜在错误。 考虑以下iOS开发人员可以编写的完美代码: 使用字符串和强制转换实例化ViewController。 容易出错的做法。 注意使用字符串引用情节提要和实例化viewControllers。 在命名情节提要或viewController时犯错误的可能性非常大,这会导致错误代码。 随着代码中使用硬编码字符串的次数增加,在代码中产生逻辑(和致命)错误的机会也随之增加 。 我希望与tableview单元格标识符相关的崩溃能够引起一定的注意。 现在,让我们看看如何避免在代码中使用字符串。 首先,让我们添加一个UIViewController扩展,它不仅在编写代码时使用最少的字符串非常方便,而且在您的应用程序使用各种独立模块(还需要使用自己的故事板)的实例中增加便利性您的主要应用程序。 UIViewController扩展可从任何模块实例化ViewController 在这里, “(\self)” 在storyboardID类属性中,只需返回ViewController的名称。 为此,您要做的就是将ViewController的Storyboard ID命名为与ViewController类相同。 简单。 方法instantiateViewController(viewControllerClass: T.Type, inStoryboard: String, ofModule: Bundle?) -> T实例化任何viewController,只要它是类UIViewController,则此控制器在位于某些模块,无论您当前模块之内还是之外。 接下来,我们为故事板名称添加一个枚举 。 Swift之所以漂亮,是因为枚举可以具有属性,甚至可以具有方法。 请参阅下面的代码片段,以了解如何添加便捷方法。 在这里,我添加了方便的方法来实例化viewControllers,navigationControllers和tabBarControllers。 一个Storyboards […]

超级易故事板本地化

尽管我们现在使用的是iOS 11,但Storyboard的本地化仍然很难解决。 总的疼痛在亚述。 这是我在SmartShopper的iOS中想到的。 创建一个名为UILocalize.swift的文件(或您喜欢的任何名称)。 2.扩展要本地化的UI元素,通过IBInspectable添加LocalizedXxxx属性 例如,要向所有UIButton添加本地化标题支持,我们可以 扩展UIButton { @IBInspectable var localizedTitle:字符串? { 得到{ 返回nil //并不重要 } 设置{ 如果让newValue = newValue { self.setTitle(NSLocalizedString(newValue,comment:“”),用于:.normal) } } } } 3.返回UI Builder,所有按钮现在都具有一个名为Localized Title的新属性。 4.现在,我只需要将其添加到我的Localizable.string文件中,例如 “ ADD_TO_FAVOURITES_CAPS” =“ SIMPAN KE SENARAI KEGEMARAN”; 5.现在,当您使用英语以外的其他语言运行应用程序时,您应该获得翻译后的文字!

Xcode的安全区域

当视图在屏幕上可见时,本指南将反映该视图未被其他内容覆盖的部分。 视图的安全区域反映了导航栏,标签栏,工具栏和其他祖先覆盖的区域,这些区域使视图控制器的视图变得模糊。 (在tvOS中,安全区域合并了屏幕的边框,如UIScreen的overscanCompensationInsets属性所定义。)它还覆盖了视图控制器的overscanCompensationInsets属性所定义的任何其他空间。 如果视图当前未安装在视图层次结构中,或者在屏幕上尚不可见,则布局指南始终与视图的边缘匹配。 对于视图控制器的根视图,此属性中的安全区域表示被遮盖的视图控制器内容的整个部分,以及您指定的任何其他插图。 对于视图层次结构中的其他视图,安全区域仅反映该视图中被遮盖的部分。 例如,如果视图完全在其视图控制器的根视图的安全区域内,则此属性中的边插入为0。 根据苹果的说法, Xcode 9 —发行说明 Interface Builder使用UIView.safeAreaLayoutGuide代替了UIViewController中已弃用的顶部和底部布局指南。 要使用新的安全区域,请在文件检查器中为视图控制器选择“安全区域布局指南”,然后在内容和新的安全区域锚点之间添加约束。 这样可以防止您的内容被顶部和底部的条以及tvOS上的过扫描区域所遮盖。 部署到早期版本的iOS时,对安全区域的约束将转换为“顶部”和“底部”。 这是现有(顶部和底部)布局指南和“安全区域布局指南”之间的比较(以产生类似的视觉效果),仅供参考。 自动版式 如何使用安全区域布局? 请按照以下步骤查找解决方案: 如果未启用,请启用“安全区域布局”。 如果它们显示与Super View的连接,则删除“所有约束”,然后使用安全的布局锚点重新附加所有约束。 或双击约束并编辑从超级视图到SafeArea锚点的连接 这是示例快照,如何启用安全区域布局和编辑约束。 这是上述更改的结果 使用SafeArea进行布局设计 为iPhone X设计时,必须确保布局充满屏幕,并且不会被设备的圆角,传感器外壳或用于访问主屏幕的指示器所遮盖。 使用标准的,系统提供的UI元素(例如导航栏,表格和集合)的大多数应用会自动适应设备的新尺寸。 背景材料延伸到显示器的边缘,并且UI元素已适当插入和放置。 对于具有自定义布局的应用程序,支持iPhone X也应该相对容易一些,尤其是如果您的应用程序使用自动布局并遵守安全区域和边距布局指南。 这是示例代码(请参阅: 安全区域布局指南 ) : 如果您在代码中创建约束,请使用UIView的safeAreaLayoutGuide属性获取相关的布局锚点。 让我们在代码中重新创建上面的Interface Builder示例,以查看其外观: 假设我们在视图控制器中将绿色视图作为属性: 私人让greenView = UIView() 我们可能有一个函数来设置从viewDidLoad调用的视图和约束: 私人功能setupView(){ greenView.translatesAutoresizingMaskIntoConstraints =否 greenView.backgroundColor = .green view.addSubview(greenView) } 像往常一样使用根视图的layoutMarginsGuide创建前缘和尾缘边距约束: 让margins […]