Tag: Objc

@objcMembers让我傻了

假设您有一个要在Obj-c中使用的Swift类。 通常,您只需使用@objc属性标记该类及其属性。 但是,如果您的类具有很多方法和属性,而不是使用@objc标记每个方法和属性,则可能更聪明的方法是使用@objcMembers属性,该属性将标记对您而言在Obj-c中可见的所有内容。 现在,这是有趣的部分。 根据苹果 将@objcMembers属性应用于类会隐式地将@objc属性添加到其所有与Objective-C兼容的成员。 这样一来,您将认为对于我的示例类来说,两种方法是平等的。 好吧,他们不是。 实际上,这些是: 为什么对我来说意味着什么? 假设您已经使用@objc作为NSObject的子类声明了该类。 该类是Swift框架的一部分,在其他一些Obj-c项目中用作依赖项。 出于某种原因,例如在重构期间,您决定从NSObject中删除继承。 这个故事如何结束? 或多或少像这样: 可是等等! 通过使用@objcMember,您很聪明,因此您得到了…… 没错 没有警告。 没有。 就这样

Swift4和Xcode9将在您现有的代码中向您发出新警告,并在附近弹出…

Swift4和Xcode9将在您现有的代码中向您发出新的警告,在您调用Swift函数Objective-C函数的区域附近弹出。 例如,当初始化UIBarButtonItem并包含#selector(swiftClassFunction)时 。 别担心! 这里发生的是,您正在调用的Swift方法对于Objective-C函数而言并不是自动可见的。 我在初始化UIBarButtonItem时发现了这一点。 Init方法是从Objective-C派生的,因此当您使用#selector添加新的Swift函数时,Xcode现在对我们大吼大叫。 这就是@objc和@objcMembers起作用的地方……您可以同时使用两个选项,并且您决定要依赖于要设置的访问权限。 选项1)在您的Swift func()声明的开头添加@objc … @objc func rightBarButtonTapped(){} 这只会将此功能公开给Objective-C。 这可能是您根据自己的情况打开的所有内容。 选项2)将@objcMembers添加到您的类定义中… @objcMembers类ViewController:UIViewController {} 此选项将打开整个课程直至Objective-C。 如果您发现一些需要弥合的差距,这可能会更干净。 参考文献 问题明细-http://bit.ly/HackingWithSwiftWhatsNewInIOS11 隐藏警告-http://bit.ly/StackOverFlowHideWarning Swift Evolution票证— http://bit.ly/SwiftEVO-LimitingObjcInference

类别方法命名的最佳做法

每个人都有一个原因,那是我们所生活的世界中最糟糕的部分。 遗憾的是,我们在iOS 11上遇到了一个与键盘框架有关的怪异问题,仅在iOS11上才发生。 有时,当文本字段变得集中时,键盘会稍微向上移动一点,如下图所示。 在键盘相关通知的信息字典中,我们可以获得键盘的框架。 通过在通知UIKeyboardWillShowNotification的事件处理程序中检查此信息,我们可以发现键盘的高度不正确。 – (void)keyboardWillShow:(NSNotification *)notification { NSDictionary *info = [notification userInfo]; NSString *curveValue = [info objectForKey:UIKeyboardAnimationCurveUserInfoKey]; CGRect rect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; NSLog(@”keyboard frame: %@”, NSStringFromCGRect(rect)); } 在iPhone 7上运行时,我们得到如下日志: keyboard frame {{0, 451}, {375, 216}} keyboard frame {{0, 292}, {375, 375}} keyboard frame {{0, 451}, {375, 216}} keyboard frame {{0, 292}, […]