-“
某种图书馆,有人更新了……Haiter与它有什么关系?” 为什么我是一名出色的开发人员,需要花时间在本文上? ”
您可能会想,亲爱的朋友。 无需浪费时间。 这只是一个晚上的阅读,伴随着有趣的笑声。 文本将涉及
RequestPermission库及其神秘的作者。
让我们从最主要的东西开始-品牌重塑! 该库已重命名为
SPPermission 。 我不知道是否是这种情况,但是更改名称后,第二周它就一直挂在
GitHub的
顶部 。 是的,有这样一个顶部,它是有条件的,但是仍然可以在其中找到有趣的项目。 作者(一个神秘的人)更新了
项目页面上的横幅,描述,
多纳特的很大一部分。 多么贪心!
但是,让我们继续进行项目本身:

从巨大的gif
(非正统的4 MB)中可以看到,该项目要求提供权限列表,其中包含图标,文本。 您甚至可以说它看起来不错。
安装
您只需将源代码拖到您的项目中,这是结构化文件的文件夹。 而且,您
不必为使用
SocoaPods构建库而
胡说八道 。 我不会告诉利弊,而不是关于本文。 将行添加到
pod文件:
pod 'SPPermission'
并更新依赖关系。 最有可能的是,这是所有未来中最困难的一步)
使用方法
如果只是将文件拖到项目中,则
SPPermission模块已经可用。 如果您
没有胡说八道,请使用
ocoaPods ,然后应将库导入控制器:
import SPPermission
现在,在
viewDidAppear函数中,
我们调用以下构造:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) SPPermission.Dialog.request( with: [.camera, .calendar, .notification], on: self ) }
我们传递权限列表和将在其中显示对话框的控制器。 它仍然可以启动项目。
客制化
亲爱的朋友,如果您曾经使用过表或集合,那么
Delegate和
DataSource一词将不会令人害怕。 如果您对模式有些痴迷,那么您甚至会大哭:
-
哇! 基于协议的方法! ”
你看! 看到了吗 但是我说这不会很有趣。 但是,一旦我读到这一行,那就继续吧。
让我们从
SPPermissionDialogDataSource协议开始,它将负责自定义对话框,并允许将库更忠诚地集成到项目中。 让我们看一下参数:
@objc public protocol SPPermissionDialogDataSource: class { @objc optional var dialogTitle: String { get } @objc optional var dialogSubtitle: String { get } @objc optional var dialogComment: String { get } @objc optional var allowTitle: String { get } @objc optional var allowedTitle: String { get } @objc optional var bottomComment: String { get } @objc optional var showCloseButton: Bool { get } @objc optional func name(for permission: SPPermissionType) -> String? @objc optional func description(for permission: SPPermissionType) -> String? @objc optional func image(for permission: SPPermissionType) -> UIImage? }
老实说,由于他们的名字在说话,所以我认为没有理由去关注每个人。 让我们
分析几个模棱两可的东西:
bottomComment和
showCloseButton 。
第一个参数负责对话框下的注释,例如,您可以输入提示“
Swipe to close ”:

第二个参数
showCloseButton负责屏幕右上角的关闭按钮。 我也有一个例子的图片:

某些函数允许返回
nil ,如果您不需要自定义所有标题/图标或文本,则这是必需的。 只需返回
nil即可保留默认值:
func description(for permission: SPPermissionType) -> String? { if permission == .calendar { return "" } lse { return nil } }
仍然需要将
DataSource对象传递给主结构:
SPPermission.Dialog.request( with: [.camera, .calendar, .microphone, .notification], on: self, dataSource: self )
委托
它允许您跟踪一些事件。 让我们看一下协议:
@objc public protocol SPPermissionDialogDelegate: class { @objc optional func didHide() @objc optional func didAllow(permission: SPPermissionType) }
嗯,不是很多。。。尽管如此,还需要什么?)我认为不值得解释将调用该函数的事件。 名字在说话。 我引起您的注意-代表一定不要忘记指出:
SPPermission.Dialog.request( with: [.camera, .calendar, .microphone, .notification], on: self, delegate: self dataSource: self )
权限

如果对图书馆有任何建议或批评,该列表将得到补充,值得
在此处创建新期刊
包子
值得注意的是有用的功能:
func isAllow(_ permission: SPPermissionType) -> Bool
它将通知您用户是否已授予权限。 为了提高忠诚度,建议不要在捆绑销售中而是在使用之前请求许可。 而且不超过3个! 尽管我发现很难提出需要更多的情况),请使用以下方法:
let isAvailableCamera = SPPermission.isAllow(.amera)
为什么更新
旧版本看起来像这样,也许在一年前它什么也没有:

实际上,我已经一年没有更新了(哦,好吧,不要假装您不了解我是图书馆的作者),但是最近,我收到了一封信……尽管让我们稍后再谈这个故事。 我们在这里做认真的事!
建筑学
大约一年前,我写
了一篇文章 ,直接击败了那些不合理使用建筑的爱好者。 但是只有我这样想,没有听到主要信息。 我简化今年的愿望没有停止。 当我进行重新设计时,我意识到该项目将必须作为一个整体进行重写。 这是一种能够收听广播,切蔬菜和半费率加热器的钻机。 一年后我看到了! 在我看来,写
这篇文章并拥有如此复杂的例子是愚蠢的。 也许再过一年,我将使其变得更加容易。 让我们看看)
那是什么故事?
教程sobsna已经结束,我们继续讨论。 几周前,我收到一封信,要求我解释图书馆的工作方式。 这是一个奇怪的问题,由于我放弃了图书馆,所以我只用一个模板回答:
亲爱的朋友,我现在不支持图书馆,我没有空闲时间。 最好的 ”
我只是在Zabugorsk写的不错。 我忘了 进入罂粟,我看到了十几个! 垃圾邮件文件夹中的邮件。 好吧,一切,显然某些门户网站已经分开,现在我该如何退订他们的邮件! 还有nnnet ...那个家伙给我写信,只是这次很生气。 在我得知自己不是该库的作者的信中(因此,我不能告诉你),我发现像我这样的人是最可怕的人(并且我们需要禁止在GitHub上注册),我发现我想要很多钱来从事我的毫无价值的工作。 有钱吗 在旧页面上甚至没有甜甜圈形式。 但是我明白这一点,那个男人只是生气。
我决定提供帮助,但不是因为好心-我对需要定制的难以置信的东西非常感兴趣,这激起了一阵愤怒。 原来,他正在寻找关闭对话框时要调用的方法。 泪水让我的笑声无止境! 在第一个版本中描述了该委托。
这个故事很可悲,但更可悲! 是的,是的! 我亲自向他详细介绍了如何使用代表(可以这么说)的一般过程。 我没有错过任何获得乐趣的机会,并说所有这些从一开始就在项目的主页上。 我得到了答案...但是我想哭更多:
“
我最近开始编程,我不想理解文档。 再见 ”
我笑了很久。
我们完成
引入了一个简短的教育程序,为了使您能专心致志,我将保留
与设计的时差链接(我不道德地舔了电子应用程序中的缩进和颜色),并提供了一个
教程 ,该
教程将展示我在此描述的所有内容,但要清晰。
所有成功迁移到新的Swift!