Tag: Objective C

斯威夫特如何穿越客观海(第1部分)

Objective-C是一个流动性很强的实体,它不会很快消失。 尽管Swift的机翼可以帮助它在天空中飞翔,但它有时可能会潜入Objective-C捕捉食物。 这是一系列Swift和Objective-c互操作性块的开始。 Swift向Objective-C公开了自己的私人代码 Swift有一个称为private的私有访问修饰符,这意味着只有其作用域内的事物才能使用它。 Objective-c没有隐私,而是隐藏的; 如果知道方法/变量的名称,则可以访问它。 假设我们有一些快速的代码,如下所示: 类静音:NSObject { 私人var名称=“ moe” 私人功能sayName()->字符串{ 返回名称 } } 因为没有公共访问权限,所以班上没有人可以访问它。 Mute()。name //不编译 您可以通过添加@objc来将Swift的真实隐私换成Objective-C的那种隐私 类静音:NSObject { @objc私人var名称=“ moe” @objc private func sayName()->字符串{ 返回名称 } } //这样调用 m.value(forKey:“ name”)//“ moe” m.value(forKey:“ sayName”)//“ moe” m.perform(“ sayName”)。takeRetainedValue()//“ moe” m.performSelector(onMainThread:“ sayName”,带有:nil,waitUntilDone:true) 在我的脑海中,您可以在目标操作模式(也就是任何选择器式API)中使用此策略。 var button = UIButton(frame:CGRect(x:0,y:0,width:100,height:100)) func initButton(){ self.addSubview(button) button.addTarget(self,action:#selector(tappedButton),用于:.touchUpInside) } @objc私人功能tappedButton(){ 打印(“做某事”) […]

Xcode,终极的调试和破解工具

调试一直是我在计算机上的一部分经验,甚至在学习编码之前也是如此。 但是,展开二进制文件和修改程序行为的满意度从未如此轻松。 通常,调试包括从十六进制编辑器来回切换到调试器,应用程序,终端,计算器等,更不用说程序退出了,您必须遵循很长的配方,直到调试会话突然结束。 不好… 但是几个月前,以破解适用于macOS的Twitter为借口,我决定最小化此问题并优化此流程。 这就是Xcode进行救援的时候。 设定 首先,我们需要创建一个以Cocoa框架为目标的Xcode项目。 调试 我们将使用嵌入式lldb控制台进行动态调试。 想象一下,适用于macOS的Twitter是我们要调试的应用程序。 通常,我们需要运行lldb并从调试器启动该进程,相反,每次我们单击Run按钮时,Xcode都会为您执行此操作。 为此,请在我们框架方案的“运行”配置中选择Twitter应用程序作为可执行文件。 这样,将编译我们的框架,并在进程附加了lldb的情况下启动Twitter应用程序。 注入代码 到目前为止,我们所做的可能已经足够了,我们可以轻松地创建针对应用程序的调试会话,还可以利用Xcode提供的自动完成功能。 但是注入代码呢? 代码注入通常涉及编译动态库并修补二进制文件,以便它链接到我们的库。 尽管如此,调试注入的代码仍然是一项繁琐的任务,并且尽管我们始终可以使部分代码自动化,但该过程缓慢而重复。 现在,借助Xcode灵活的配置方案和一些魔术,我们可以轻松修补正在检查的应用程序的运行时,而无需修改其二进制文件(双赢)。 例如,让我们注入一些代码,记录每次对viewDidLoad调用。 Cocoa Framework项目模板创建一个名为nameOfTheProject.h的头文件。 我们将创建其各自的.m文件,并将混乱的逻辑放入其中。 照原样,Xcode将编译我们的框架,并在调试器附加到其过程的情况下启动Twitter应用程序。 链接这两者就像使用环境变量运行过程一样容易,该环境变量迫使位于给定路径上的库加载。 这个环境变量是DYLD_INSERT_LIBRARIES ,是我们库${TARGET_BUILD_DIR}/${TARGET_NAME}.framework/Versions/A/${TARGET_NAME}的路径。 在方案的“运行”配置的“ 参数”选项卡中设置环境变量后,单击“运行”按钮。 我们的代码应该已经正确注入到Twitter流程中。 还不够好? Xcode提供的所有其他调试工具也都可用,从视图层次结构到内存图调试器。 加起来 无论您是否进行逆向工程,我都建议您尝试一下,也可以使用TwitterX来获得有关此设置功能的更多信息。

目标C语言的方法或功能

方法或函数是一堆代码,我们可以使用一个唯一的名称从代码的其他地方调用,该方法将执行某些任务或返回我们可以使用的某种结果。 方法用于将我们的代码组织为可重用(和可理解)的方式,从而节省了很多时间和精力。 目标C有两种方法 不返回任何内容的方法 返回值的方法 让我们看看如何创建方法并调用该方法。 方法声明的语法 没有参数 -(返回类型)MethodName { //具有一堆代码的方法主体 } 2.带参数 -(返回类型)MethodName:(Parameter DataType)ParameterName { //具有一堆代码的方法主体 } 方法调用的语法 [self MethodName]; 让我们看看什么都不返回的方法 方法声明,不返回不带参数的内容 -(无效)PrintName { NSLog(@“我的名字是Verma Mukesh”)); } [Self PrintName]; //执行方法后,控制台上将显示“我的名字是Verma Mukesh” 不声明任何参数的方法声明 -(无效)PrintName:(NSString *)strName { NSLog(@“我的名字是%@”,strName); } [self PrintName:@“ Verma Mukesh”]; //执行方法后,控制台上将显示“我的名字是Verma Mukesh” 方法声明,该方法返回Nothing多个参数 -(无效)PrintFullName:(NSString *)strFirstName AndLastName:(NSString *)strLastName { NSLog(@“我的全名是%@%@”,strFirstName,strLastName); } [self PrintFullName:@“ Verma” […]

放下故事板

每年在WWDC上,Apple都会大张旗鼓和鼓掌地宣传Interface Builder的新功能,通常是在顶级会议中,例如大型的“国情咨文”会议。 如果您在Interface Builder中布置视图,则是个好消息。 同时,如果您在代码中布置视图,则新功能很少而且相差很远。 iOS 9中引入的关于在代码中创建自动布局约束的新语法的唯一提及是在15分钟内被塞进了名为“自动布局之谜,第二部分”的会话中! 不完全是黄金时间。 真遗憾的是,Apple没有提倡更多地在代码中布局视图,并且没有以与更新Interface Builder相同的速度来改进这样做的工具。 在代码中放置视图可以真正提高生产力,并且可以很好地提高代码的整体质量。 为什么不只使用Interface Builder? 有许多原因应避免使用Interface Builder,其中一些原因与编写代码的优势有关,而某些原因与Storyboards和Interface Builder的缺点有关。 我将在这里讨论一些关键问题。 除非我特别提到情节提要,否则下面将仅使用术语“ 界面生成器” ,因为大多数问题都与所有情况有关。 首先,Interface Builder文件只能由Xcode生成和读取。 您可以将文件读取为XML,但是它们没有什么意义,或者至少,XML本身对事物的实际布局没有多大帮助。 当您发生合并冲突时,这会带来问题,对于包含许多视图控制器信息的情节提要,合并冲突会变得非常严峻。 您可以无意中更改视图或视图控制器的布局,这可以通过单击错误或打开文件来实现。 Interface Builder通常只是因为打开文件而对文件进行了更改。 当查看差异时,很难将其与您自己的更改区分开来,也很难进行推理。 换句话说,更改可能很难(在提交之前由您自己审核,而在进行代码审核时则由团队伙伴审核)。 由于Xcode幕后发生的所有变化都会使臭虫迷失,因此臭虫可能会被发现而未被发现。 Interface Builder的一个基本问题是,您在界面中看到的大部分内容都是视图的设计时快照。 您可以修饰视图以使其看起来像实时运行。 例如,从文件或服务器获取并仅在运行时加载的任何数据都必须在设计时进行模拟,并在运行时由实际数据替换,或者完全不在设计之列,这会破坏视觉布局的意义。 。 这将模拟数据与您实际想要显示在应用程序中的设计时数据混合在一起。 换句话说,您必须拆除设计时布局并在运行时构建运行时布局。 仅在设计应用程序时供您查看的数据很容易泄漏并成为运行时数据,这是非常不幸的。 您在Interface Builder中设置的某些属性只是更好地在代码中设置。 为了您自己,或者为了任何人继承您的代码。 颜色和字体是要在代码中以一种或另一种方式定义为常量的事物的绝佳示例。 如果它们将来会发生变化,我不会羡慕那些必须通过所有观点来选择新颜色或新字体的人。 如果您确实在代码中定义它们,则当前无法在Interface Builder中引用它们。 无论您做什么,都会有很多挑选的颜色和字体。 如果在Interface Builder中只保留设计中的字体和颜色,而仅在代码中进行设置,那么这将违反Interface Builder的目的。 代码对Interface Builder中对象的引用通常由字符串标识符组成,在这些字符串标识符上没有编译时检查。 如果您更改,删除或错误拼写了任何这些字符串,则可能会导致应用程序在运行时崩溃或停滞。 如果您没有在发布前测试确切的代码路径,那么您会感到不满意。 当您使用Interface Builder时,Swift由于强大的键入和编译时间检查而带给我们的许多代码安全性会丢失。 […]

从另一个类访问目标C中的私有财产和私有iVar

在目标C中定义类时,属性定义为公共或私有。 公共属性包含在.h文件中,私有属性包含在.m文件中。 我们还可以选择声明一个实例变量,该实例变量也是私有的并且没有属性访问器。 下面的.h文件具有一个名为privateArray的NSArray对象,该对象是一个实例变量,还有一个名为myDictionary的公共属性,它是一个NSDictionary。 在下面的.m文件中,有一个名为myPrivateDictionary的NSDictionary私有属性。 如果我们尝试从另一个类访问私有属性,则该私有属性将不可用,如下所示。 如果我们将MyClass的@interface定义添加到ViewController类中,并包括myPrivateDictionary的属性,我们将能够访问private属性。 从下面的屏幕快照中可以看到,Xcode现在可以解析myPrivateDictionary。 尽管我们可以使用键值观察( KVO )的功能来访问该私有实例变量,但是MyClass中的实例变量privateArray是该类的私有实例。 请记住,如果类的创建者已将accessInstanceVariablesDirectly设置为FALSE,则此方法将不起作用。 让我们运行代码以演示它已成功读取实例变量并对其进行了设置。 正如您从下面看到的那样,它已经实现了该目标。 让我们更新代码,以便实例变量存储在ViewController.m文件的局部变量中。 让我们运行代码以查看输出,正如您从下面看到的那样,它未能更改实例变量的值,当我们通过KVO访问实例变量时,它复制了对象而不是分配了指针。 请记住这一点,在使用KVO尝试为实例变量设置新值时,请始终使用setValue。 我希望您觉得这篇文章对您有帮助,如果您喜欢,分享或发表评论。

iOS-使用UIScrollView,UITextView和自动版式

我正在为iOS开发,因为iOS 2和iPhone 3G和UI界面是我开发应用程序时最简单的任务之一。 一切都是静态的,所有视图都完全像您将它们放置在XIB中一样。 但是情况发生了变化,iOS 6引入了自动布局,因为iPhone 5比其祖先更高。 对于简单的应用程序来说,这是一个容易克服的问题。 然后推出了iPhone 6和iPhone 6 Plus,那天开始了我的噩梦。 自动布局是唯一的方法,经过数周的练习,我终于开始使用它了(大多数时候)。 在使用自动版式处理大量项目之后,我感到很自信。 直到我尝试将Auto Layout与UIScrollView一起使用时。 使它正常工作是很棘手的,每次我尝试实现它时,我都会通过Google和StackOverflow进行自我搜索。 因此,我决定将本教程写到教程中,并提供确切的步骤,以帮助将来我以及其他在UIScrollView中苦苦挣扎的人。 因此,让我们从一个UIViewController和一个空白的UIView开始。 继续并添加一个UIScrollView。 选择UIScrollView,然后添加以下约束: 这样,UIScrollView将具有与初始UIView相同的大小。 然后在UIScrollView下添加一个新的UIView。 展开新的UIView,使其具有与UIScrollView相同的大小。 从新的UIView Ctrl +拖动到UIScrollView。 然后添加前导空间,尾随空间,顶部空间,底部空间和等宽约束。 如果一切正确,“自动布局”将抱怨UIScrollView的高度。 可以,因为还不知道高度是多少。 现在我们需要添加标签,文本字段,按钮或文本视图,并添加它们的约束,就可以完成了。 在本教程中,我将使用与UIScrollView一起使用时比较棘手的UITextView。 因此,让我们在新的UIView下添加一个UITextView。 调整大小并添加以下约束: 现在,您会注意到,自动版式仍然在抱怨UIScrollView的高度。 这里的问题是,默认情况下,UITextView已检查IB中的“滚动启用” 。 因此,找到该复选框并取消选中它。 在您的UITextView中添加大文本并运行您的项目! 您会注意到,您拥有一个带有UITextView和滚动功能的UIScrollView。 那是困难的部分。 现在继续添加您的控件并制作一些出色的应用程序!

如何使用Objective-C模仿Swift:权威指南。

注意:本文的目标是成为现代Typed Objective-C的入门文章。 超过一半的材料和想法是原创的。 对于那些不是,我链接了原始来源。 如果您有好主意或我错过了什么,请通知我。 您的资料将被发布,并被添加为作者。 这一年差不多是2019年。Swift现在是4.2版。 自从用Objective-C编写不再是“流行”并且在会议或聚会上“脱颖而出”甚至是危险的以来已经过去了六年。 但是,那些认识到swift的好处的人应该怎么做,就已经写了一些项目,但是由于某些原因而坚持使用Objective-C(也许是由于次要版本之间ABI不稳定)。 让我们看一下swift的功能,以及我们是否可以尝试“模仿”或超越它的某些功能…… PS:那些达到本文7/8要求的人将获得Dessert,并且肯定会喜欢它! 目录 结构 纯功能 默认接口实现 泛型 抽象方法 最后 铸件 枚举 开关范围: 默认参数 阻止可见性 选装件 甜点 自动打字 类型迭代 复制中 延期 检查密钥路径 Swift有结构,但C也有。但是,直到Xcode 10,他们才不支持ARC for Objective C类型,只支持__unsafe_unretained和自由跳舞 可以救我们 但是自这次WWDC演讲以来,一切都发生了变化:https://developer.apple.com/videos/play/wwdc2018/409/ 那么,我们现在该怎么办? 乍一看似乎不太方便。 如果没有丑陋的循环释放,我们就不能在数组中使用它。 在放入NSArray之前,我们仍然必须转换为NSValue,但是要感谢__attribute __((objc_boxable))的语法更简单。 实际上有大量的实现… 例如,初始化程序。 我相信少数人会与Bob叔叔不同意,函数的最大参数应为3个参数,如果更多,则应努力使用结构。 好吧,在现代C结构出现之前,我们仅限于使用这样的东西。 @interface SomeService -(非空实例类型)initWithBlobData :(非空BlobData * const)blob NS_DESIGNATED_INITIALIZER; @end 而且我们所有丑陋的初始化方法都将迁移到模仿值类型的类: […]

使用Swift介绍Firebase

我是为AppCoda.com编写的。 您可以在以下网址找到完整的教程:https://www.appcoda.com/firebase-login-signup/。 自从Parse开始关闭以来,已经有一些数据库试图替代用于移动应用程序的Parse,例如Firebase和Realm。 Firebase由于其易用性和速度而成为当前最受欢迎的一种。 它还可以与Android,Web和iOS一起使用,这意味着它对于大型项目非常有用,因为数据库可以跨所有主要设备进行连接。 Firebase由Google拥有,这意味着这些服务器非常可靠,并且在需要时可以提供大量帮助。 一些大型科技公司(例如PicCollage,Shazam,Wattpad,Skyscanner和其他大型初创公司)也使用Firebase,因此您可以了解Firebase的可靠性。 随着Firebase的最新更新,它变得比以往任何时候都更加强大和强大。 您可以使用AdMob在平台上赚钱,也可以通过使用通知来保持用户忠诚度,或者使用云消息传递和存储来制作功能非常强大的应用。 Firebase肯定会留在这里。 在本教程中,我们将研究其中的一个关键方面,即登录和注册。 我们还将研究重置用户密码。 我们将使用最新版本的Firebase和XCode以及Swift3。在本教程中,您需要对Swift和XCode有基本的了解。 我们需要做的第一件事是开始一个新的XCode项目,我将使用“单一视图”应用程序,但是该概念将适用于从Tab-Bar应用程序到Master-Detail应用程序的任何样式。 您可以随心所欲地调用该项目,但对于本教程,我将其称为FirebaseTutorial1 。 将语言设置为Swift,设备无关紧要,因此您可以保持通用性。 然后,您需要转到Main.storyboard并创建如下界面: 但是,为了节省时间并让您专注于学习Firebase,可以在此处下载starter项目,并且在情节提要完成后,外观应类似于此,文件也应具有此外观。 如果您想从头开始构建项目,则必须遵循以下视图控制器和过程: 1.首先,将三个视图控制器拖到情节提要中,然后向每个视图控制器添加两个按钮。 这两个按钮用于在不同的视图控制器之间导航。 假设您在登录页面上时,可以导航到重置密码页面或注册页面。 2.在两个视图控制器中,添加两个文本字段和一个按钮。 这些文本字段用于“电子邮件”和“密码”字段。 该按钮用于登录或注册。 在占位符中,将电子邮件或密码放在希望用户输入电子邮件和密码的位置。 然后,您可以更改背景的颜色,使其看起来更好一些,然后在顶部添加标签。 3.在第三个视图控制器(“重置密码”)中,添加三个按钮,一个文本字段和一个标签。 文本字段供用户输入用于重置密码的电子邮件。 4.完成UI的设计后,其余过程就是将按钮与其他视图控制器连接起来,以便用户可以在视图之间进行转换。 在这里,我建议您对segue使用“模态呈现”。 现在用户界面已经准备就绪,我们现在将项目与Firebase集成在一起。 为此,您首先需要转到https://firebase.google.com/并在Firebase中设置项目。 假设您已使用Google帐户登录到Firebase,请单击“免费入门”,然后选择“创建新项目”。 它将带您到一个为您的项目命名的屏幕。 随便命名项目,然后选择您的所在地。 Firebase为您创建新项目后,将带您进入概述。 您可以在此处选择应用程序平台,无论是Web,Android还是本例中的iOS。 您也可以在这里找到文档,并在侧面访问身份验证,存储,数据库等等。 现在选择“将Firebase添加到您的iOS应用程序”,然后将提示您输入iOS Bundle ID 。 这是您的Xcode项目的包标识符(请注意,您的包ID可能与我的不同)。 确保您正确输入了捆绑包ID,并且可以选择为应用程序选择一个昵称。 如果您的应用程序已经在App Store上发布,则添加您的App Store ID。 但是对于此演示,您不必执行此操作。 完成后,单击“添加应用”继续,Firebase将为您生成一个名为GoogleService-Info.plist的文件。 它应该自动下载到Mac计算机上。 这将带您进入下一个阶段。 按照说明将GoogleService-Info.plist拖动到Xcode项目的根文件夹中。 […]

UITableView自定义大小的单元格(使用UITableViewAutomaticDimension自动计算行高)

一个简单,用途广泛但功能强大的视图,可以使用行和单个列以列表形式显示数据。 用户可以在表视图中垂直滚动项,并可以选择操作和选择内容。 自定格单元 苹果公司推出了自动上浆电池。 使用Autolayout显式地布局UITableViewCells,UITableView会为您处理其余的工作。 行高是自动计算的,默认情况下rowHeight值为UITableViewAutomaticDimension。 在计算自调整大小的单元格时,将使用UITableView属性estimatedRowHeight。 创建自定义大小的表格视图单元格时,需要设置此属性并使用约束来定义 单元的大小。 — Apple,UITableView文档 self.tableView.estimatedRowHeight = 44.0 请注意,如果要为所有单元格设置动态高度,则不需要 tableView的委托的heightForRowAtIndexPath。 只需在必要时以及重新加载或加载表格视图之前设置以上属性。 但是,您可以通过以下功能设置特定单元格的高度,同时使其他单元格动态化: 迅速 覆盖func tableView(tableView:UITableView,heightForRowAtIndexPath indexPath:NSIndexPath)-> CGFloat { 切换indexPath.section { 情况1: 返回60 默认: 返回UITableViewAutomaticDimension } } 目标C -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 开关(indexPath.section){ 情况1: 返回60; 默认: 返回UITableViewAutomaticDimension; } }

适用于iOS的My Development Toolset 2019🛠

更新:2018年11月26日 大家好,我想在2019年更新一些我用于iOS开发工具,开源应用程序,网站,存储库,库的工具集,以及我目前仍在使用的其他工具。 本文将全年不断更新。 您可以找到我的2017年工具集到2018年的一些更新以及一些新建议以及其背后的原因。 从我的2019列表中删除了一些工具。 原因是,我不再继续使用此工具Gitscout , Bee , GitKraken , 完美无瑕 。 我在下面对其中一些发表一些评论。 工具类 有一个新的第一名。 它的名字叫夏洛克 。 我们可以实时编辑视图和布局约束,模拟在其他设备上的运行。 他们是RevealApp的完美团队。 FASTLANE我强烈建议您进行扫描,比赛和健身功能。 上周,我发现了一个很棒的工具,可以实时跟踪您的请求请求并列出所有受监视的存储库。 还有iOS和Android版本。 这个程序值得五颗星。 预告片 ModMove ,您可以使用键盘快捷键和鼠标轻松移动/调整窗口大小。 这对于HyperSwitch确实是我的最爱。 Injection ,将Swift / Objective-C代码动态插入正在运行的应用程序中。 它不会对您的项目进行任何更改。 您也可以与AppCode一起使用。 Cacher是专业开发人员的代码片段组织者。 您可以管理要点摘要。 NightOwl Mojave之后,我们在macOS上遇到了DarkMode。 NightOwl进一步扩展了此功能。 您可以自动配置日出/日落,安排个人配置,并可以轻松更改所有配置。 普利姆 是一个了不起的演示工具。 它总是更新的,对于Sprint演示会议非常有帮助。 您可以隐藏桌面项目,禁用通知,使扬声器静音。 救援时间 是跟踪您如何在开发中花费时间或正在使用哪些工具的理想工具。 我推荐了GitKraken 在2017年用于GIT。我有很好的理由,例如GitFlow 可以由GitKraken自动添加。 另外,他们有gitlab支持。 GitKraken走了很长一段路。 但是当启动一个大型项目(例如15分钟的编译时间)并且该项目中总共有142802个代码时, SourceTree自2017年11月以来就是我新喜欢的GIT GUI。 KeepingYouAwake是适用于macOS的小型菜单栏实用程序,可以阻止Mac在预定义的持续时间内或激活后进入睡眠模式。 […]