Articles of cocoa touch

在Swift中使用CoreNFC构建NFC扫描仪应用

近场通信(NFC)是一种技术,它可以在一定距离(通常约4厘米)内的两个设备之间实现非接触式通信。 如今,NFC已用于非接触式支付系统,电子身份证,电子票证中,并用于共享信息,例如联系人,照片,视频或URL。 可以用于使用NFC读取信息的此类标签或卡称为NFC标签。 根据维基百科,在完整的NFC设备中可以执行3种通信模式: NFC卡仿真 使支持NFC的设备(例如智能手机)像智能卡一样工作,允许用户执行交易(例如付款或票务)。 NFC读/写器 使启用NFC的设备能够读取存储在标签或智能海报中嵌入的廉价NFC标签上的信息。 NFC对等 使两个启用NFC的设备相互通信,以特定方式交换信息。 iOS中NFC的当前状态 iOS中的NFC始于2014年的Apple Pay发行。iPhone7和iPhone 7 Plus是第一批内置NFC硬件的设备,可用于使用Apple Pay执行非接触式支付。 但是,除了Apple Pay功能之外,Apple没有提供任何API供第三方开发人员使用NFC功能。 苹果最终在iOS 11中引入了CoreNFC框架,该框架使第三方开发人员能够在其应用程序中读取NFC标签。 当应用程序在前台运行时,该API仅支持读取NFC标签。 在iOS 12中,随着Apple新款iPhone的发布:Xr,Xs,Xs Max,Apple终于引入了扫描NFC标签的功能,而无需使用这些设备运行应用程序。 它还使用Apple Universal Link机制处理将扫描重定向到关联的应用程序。 截至目前,CoreNFC还无法写入NFC标签。 我真的希望iOS 13将为第三方应用程序提供写入标签的功能,因为执行写入所需的硬件已经存在。 我们将建立什么 在本教程中,我们将构建一个充当产品扫描程序的简单应用程序。 这是该应用程序的主要功能: 该应用程序将扫描NFC标签并获取关联的URL,以检索产品SKU ID; 然后,该应用会使用特定的SKU ID搜索其本地数据存储; 如果找到,该应用程序将显示产品的详细信息,例如名称,图像,描述,价格和可用性; 使用Apple Universal Link和Firebase托管无需运行应用程序即可扫描NFC标签。 开始项目 您可以从下面的GitHub存储库中克隆入门项目源代码: alfianlosari / NFCScanneriOSStarter NFC产品扫描仪iOS演示应用程序的入门项目– alfianlosari / NFCScanneriOSStarter github.com 入门项目包含所有自定义表格视图单元格,将在应用程序UI中使用的资产以及Product模型。 产品型号和本地数据存储 我们使用具有几个属性的Product模型来表示产品。 请记住,产品ID是每个产品的唯一标识符,商店将使用它来查找产品。 […]

使用UICollectionView构建自适应的自适应iOS应用

UICollectionView是一个UIKit视图,用于管理已订购商品的集合,并使用可自定义的布局显示商品。 它是由Apple在WWDC 2012中随iOS 6 SDK发行而引入的。 UICollectionView接口与旧的UITableView非常相似,因为它提供DataSource作为显示数据的源,并提供Delegate处理每个项目的交互。 与UITableView在UITableViewCell内部使用固定列表布局显示每一行不同, UICollectionView通过子类化UICollectionViewLayout为开发人员提供了灵活性和可自定义性以提供自己的布局,它还支持自定义装饰视图,每个单独的横断面图和单元格的可自定义大小。 Apple本身提供了一种UICollectionViewFlowLayout布局,称为UICollectionViewFlowLayout 。 UICollectionViewFlowLayout是使用网格系统显示项目的布局,并支持页眉和页脚。 它还提供了2个垂直和水平滚动方向。 在垂直方向上,项目的宽度受集合视图的宽度限制,因此在每一行中,它会尝试在下降到下一行之前在集合视图宽度的范围内填充尽可能多的项目,因此用户可以垂直滚动内容。 在水平方向上,内容的高度受集合视图的高度限制,因此在每一列中,在向右移动到下一列之前,将尽可能多地添加项目,以便用户可以水平滚动。 如果要使用集合视图构建圆盘传送带,则水平滚动方向非常适合。 我们将建立什么 在本文中,我们将使用UICollectionViewFlowLayout构建一个自适应的电影列表应用程序,以适应从小型iPhone 5到最大iPad Pro的各种UICollectionViewFlowLayout 。 用户将具有使用列表,小网格和大网格布局显示电影的选项。 以下是我们将要执行的任务: 启动项目。 建立模型。 构建MainListViewController 。 构建列表布局。 构建网格布局。 开始项目 要开始项目,您可以在下面的GitHub存储库中下载入门项目。 alfianlosari /响应式iOS收集视图启动器 带有Collection View的自适应和自适应iOS App的入门项目… github.com 入门项目包含多个资产,用于列表的集合视图单元格以及我们将用于集合视图的网格项目布局。 建立模型 让我们创建代表电影的模型。 创建一个新文件,并将其命名为Movie.swift 。 复制下面的声明以创建具有所有属性的Movie结构。 我们还需要确保更新MovieLayoutListCollectionViewCell ,在这里我们创建一个方法setup(movie:)以便在通过电影时可以设置标签和图像视图。 建立网格布局 让我们构建网格布局,在此布局中,每个单元格将仅在每个单元格内显示电影的海报图像。 窥视入门项目提供的MovieLayoutGridCollectionViewCell ,以查看布局。 确保更新MovieLayoutGridCollectionViewCell ,在这里我们创建一个方法setup(movie:)以便在通过电影时可以设置图像视图。 结论 最后,恭喜!我们已经成功使用Collection View构建了自适应的自适应iOS应用程序! 借助Cocoa Touch […]

使用Swift 5结果类型构建简单的异步API请求

Apple终于在2019年3月底将Swift 5发布到稳定版频道。它捆绑在macOS的Xcode 10.2中。 Swift 5为Apple平台中的Swift标准库提供了ABI稳定性。 这意味着,所有未来的Swift版本将与使用Swift 5代码编写的应用二进制兼容。 它还引入了App Thinning,缩小了应用程序的大小,因为ABI的稳定性意味着二进制文件不必将所有Swift标准库嵌入应用程序包中,从而减小了应用程序的大小。 从iOS 12.2开始,操作系统将包括Swift运行时和标准库。 您可以在下面的链接中阅读与Swift的未来有关的所有有关模块稳定性和库演变的信息。 ABI稳定性和更多 在MacOS,iOS,watchOS和tvOS上稳定Swift的ABI是一个长期的目标。 swift.org 是一个稳定的ABI。 在本文中,我们将讨论Swift 5的新Result类型,以及如何利用它来创建异步API请求并简化对完成处理程序闭包的处理。 在开始之前,让我们看看我们通常如何在Swift中创建一个异步函数。 我们通常使用几种方法。 1. Objective-C风格 使用Objective-C样式,我们创建一个带有多个参数的单个回调closure ,其中包含异步函数中的可选result value和可选error 。 func fetchMovies(URL:URL,completionHandler:@ 转义 ([Movie] ?, Error?)-> Void){ … } 2. Swift风格 在这种样式中,我们创建2个完成closures 。 一种是将result value作为参数处理成功,另一种是the error作为参数处理失败。 func fetchMovies(URL:URL,successHandler:@ 逃逸 ([Movie])->无效,errorHandler:@ 逃避 (Error?)->无效){ … } 介绍Swift 5结果类型 Swift 5最后引入了新的Result类型,以使用enum来处理异步函数的结果。 只有两种情况都使用带有关联值的Swift […]

Swift 5.0引入了新的结果类型…..?

Swift 5.0引入了新的 结果类型 作为通用枚举实现的,有两种情况 :。 成功和。 失败 , 在每种情况下都包括一个关联值。 值与大小写关联。 成功可以是任何值(取决于您)。 值与case关联。failure必须是采用Error协议的类型 。 为什么? 结果类型 — 它 提供 了一种更清晰,类型安全的错误处理方式。 例如-让我们创建一个简单的函数toInteger ,它将字符串转换为整数并返回Result 。 请注意, case .success的关联值是Int类型,而case .failure的关联值是AnErrorType类型,该值采用Error协议。 现在我们可以像这样使用它: 因此,通过使用 Result类型 ,很明显,我们可以获取 Int 类型的 结果值 或 AnErrorType 类型的强类型错误值 。 不可能 全有 或 全无 结果类型 提供 了更清晰,类型安全的错误处理方式。 另外, Result类型支持特定的初始化器,该初始化器接受引发的闭包- 例如 – 目前为止就这样了。 感谢您的阅读! 这是我有史以来第一篇中级职位。 我希望本快速阅读可以使您快速了解利用枚举功能在Swift 5.0中引入的新Result类型。 我真的很感激我的任何建设性批评,请随时在这里发表您的看法。 请通过与世界各地的Swift爱好者分享并分享这篇帖子,来帮助我传播信息。 […]

在接收applicationDidEnterBackground时退出应用程序而不是输入背景

我想知道在用户按下Home按钮后是否可以完全退出程序,而不是进入后台运行模式。 谢谢。

没有的UITableView仍然有效!

我已经读过,每当你使用UITableView你应该将你的控制器类符合协议(如果你没有使用量身定制的UITableViewController类)。 所以我的超类是UIViewController但我忘了在.h文件中添加声明。 出于某种原因,该表仍然有效。 它从类中获取数据,单击单元格按预期工作。 有人可以向我解释一下 – 为什么它有效?

UINavigationBar右键没有显示出来

我通过通知使用以下function在我的UINavigationBar上加载一个右键,即使我可以找出按钮并validation它已分配,但它没有出现……任何想法? 编辑2011年4月6日,下午2:42 所以,有趣的东西……宽度总是报告为0.0 … – (void)showRightBarButton:(id)sender { NSLog(@”Showing button”); UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(showPI:)]; [button setTitle:@”This Button”]; self.navigationItem.rightBarButtonItem = button; //[[self.navigationItem rightBarButtonItem] setWidth:50]; NSLog(@”Button width is %f.”, self.navigationItem.rightBarButtonItem.width); [button release]; }

在播放新声音之前等待另一声音完成

我正在开发一个播放声音的iPhone应用程序。 如果声音已经播放,我不想中断或播放另一种声音,无论它是从哪个“产生”播放。 我的代码如下: if(distance <= 10) { NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"wav"]; SystemSoundID soundID; AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID); AudioServicesPlaySystemSound(soundID); } 简单地说,如果一个人已经在玩,我不想播放新的声音。 如果已经播放,我不想排队播放另一个声音。 这可能吗?

动画UITableViewCell ContentView在进入编辑模式时淡出

我在iPhone Mail.app和SMS.app应用程序中注意到了这个function,但我不确定如何自己实现它。 在标准的UITableView中,当用户点击“编辑”按钮并且删除按钮移动到位时,当内容视图向右滑动时,它们会执行快速淡入淡出过渡,其中它们被更薄的自身版本替换(对于帐户)删除按钮占用的空间)。 我最初认为这是通过在启用编辑模式时调用以下方法来完成的: [self.tableView reloadRowsAtIndexPaths: [tableView indexPathsForVisibleRows] withRowAnimation: UITableViewRowAnimationFade]; 然而,这可能是正确的,因为它也淡化了删除按钮本身的转换以及单元格所具有的任何附件视图(足以说明,它看起来很奇怪)。 我想知道,当表格进入编辑模式时,如何强制内容视图重绘自身,然后将新绘制的版本淡化旧版本? 更新:感谢Caleb的回答,这是最后一段代码,让我能够得到我以后的内容: 我的最终解决方案是inheritanceUITableViewCell,然后将以下代码应用于setEditing访问器: -(void) setEditing: (BOOL)editing animated: (BOOL)animated { [super setEditing: editing animated: animated]; CATransition *animation = [CATransition animation]; animation.duration = 0.2f; animation.type = kCATransitionFade; //redraw the subviews (and animate) for( UIView *subview in self.contentView.subviews ) { [subview.layer addAnimation: animation forKey: @”editingFade”]; [subview setNeedsDisplay]; […]

根据currentLocale的NSDateformatter setDateFormat

我很生气,可能是一个愚蠢的问题。 我有3个字符串:年,月和日。 我需要基于currentLocale以正确的格式设置日期,所以如果currentLocale localeIdentifier是en_US,我的dateFormat应该是:MMM / dd / yyyy 如果它是fr_FR,则dateFormat应为dd / MMM / yyyy 我不认为这样做的唯一方法是获取currentLocale localeIdentifier,然后以一堆if开头。 提前致谢。 马克斯