在Swift编程语言中,它说:
函数也可以采用可变数量的参数,将它们收集到一个数组中.
Run Code Online (Sandbox Code Playgroud)func sumOf(numbers: Int...) -> Int { ... }
当我用逗号分隔的数字列表(`sumOf(1,2,3,4))调用这样的函数时,它们可以作为函数内的数组使用.
问:如果我已经有一个数字数组要传递给这个函数怎么办?
let numbers = [1, 2, 3, 4]
sumOf(numbers)
Run Code Online (Sandbox Code Playgroud)
这会因编译器错误而失败,"无法找到接受所提供参数的'__conversion'的重载".有没有办法将现有数组转换为可以传递给可变函数的元素列表?
我有一个CAShapeLayer(它是UIView子类的一层),path
只要视图的bounds
大小发生变化,它就会更新.为此,我重写了图层setBounds:
重置路径的方法:
@interface CustomShapeLayer : CAShapeLayer
@end
@implementation CustomShapeLayer
- (void)setBounds:(CGRect)bounds
{
[super setBounds:bounds];
self.path = [[self shapeForBounds:bounds] CGPath];
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,直到我为边界变化设置动画.我希望在任何动画边界变化(在UIView动画块中)中创建路径动画,以便形状图层始终采用其大小.
由于该path
属性默认没有动画,我想出了这个:
覆盖图层的addAnimation:forKey:
方法.在其中,确定是否将边界动画添加到图层.如果是这样,通过复制传递给方法的边界动画中的所有属性,创建第二个显式动画,以便为边界旁边的路径设置动画.在代码中:
- (void)addAnimation:(CAAnimation *)animation forKey:(NSString *)key
{
[super addAnimation:animation forKey:key];
if ([animation isKindOfClass:[CABasicAnimation class]]) {
CABasicAnimation *basicAnimation = (CABasicAnimation *)animation;
if ([basicAnimation.keyPath isEqualToString:@"bounds.size"]) {
CABasicAnimation *pathAnimation = [basicAnimation copy];
pathAnimation.keyPath = @"path";
// The path property has not been updated to the new value yet
pathAnimation.fromValue = (id)self.path;
// …
Run Code Online (Sandbox Code Playgroud) iOS SDK 4.2包含一个UIApplicationDelegate
名为的新方法application:openURL:sourceApplication:annotation:
.它是application:handleOpenURL:
对调用应用程序的替代和提供更多信息:我们不仅获取调用应用程序的包标识符,而且还在annotation
参数中,
源应用程序提供的属性列表对象,用于将信息传递给接收应用程序.
太棒了,这应该为多个第三方应用之间更直接的互动提供了很多机会!
唯一的问题是:如何在调用应用程序一侧调用此机制?-[UIApplication openURL:]
似乎没有改变,也没有提供任何方法来传递属性列表和URL.你知道调用应用程序如何用iOS SDK 4.2做到这一点吗?
我想UICollectionView
将与动画单元格插入一起运行的动画中的a的帧大小更改为performBatchUpdates:completion:
块内的同一集合视图.
这是触发单元格插入的代码:
[collectionView performBatchUpdates:^{
indexPathOfAddedCell = ...;
[collectionView insertItemsAtIndexPaths:@[ indexPathOfAddedCell ]];
} completion:nil];
Run Code Online (Sandbox Code Playgroud)
因为单元格插入导致集合视图contentSize
发生变化,所以我尝试KVO注册对该属性的更改,然后从KVO处理程序触发集合视图框架更新.
这种方法的问题在于KVO触发器contentSize
触发太晚了:当时单元插入动画已经完成(实际上,KVO在performBatchUpdates:completion:
被调用的完成处理程序之前触发,但是在动画在UI中播放之后).
我没有使用自动布局.
编辑:我放了一个示例项目来演示我在GitHub上的问题.
编辑2:我应该提到我需要这个我正在写的一个组件(OLEContainerScrollView
)应该100%独立于集合视图.因此,我不能对集合视图布局进行子类化,也不会影响触发单元格动画的代码.理想情况下,解决方案也适用UITableView
,它表现出相同的行为.
使用Xcode 9为IOS11编译我的应用程序时,我收到以下警告:
warning: 'touchIDLockout' was deprecated in iOS 11.0: use LAErrorBiometryLockout
warning: 'touchIDNotEnrolled' was deprecated in iOS 11.0: use LAErrorBiometryNotEnrolled
warning: 'touchIDNotAvailable' was deprecated in iOS 11.0: use LAErrorBiometryNotAvailable
Run Code Online (Sandbox Code Playgroud)
我正在使用touchID,但我没有使用touchIdLockout ... cste,touchID工作正常.
我该如何删除这些警告?
我将此追踪到一个原因.LAError
从我的代码中的LocalAuthentication框架引用就足以显示这些警告.
重现的步骤(在Xcode 9.2中尝试过):
将这些行添加到AppDelegate.swift
:
import LocalAuthentication
Run Code Online (Sandbox Code Playgroud)
还有一行appDidFinishLaunching
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let _: LAError? = nil
return true
}
Run Code Online (Sandbox Code Playgroud)构建应用程序.
该let _: LAError? = nil
行足以显示三个警告.但是,警告与任何特定代码行都没有关联.它们出现在构建日志中,没有任何文件/行引用:
<unknown>:0: warning: 'touchIDLockout' was …
Run Code Online (Sandbox Code Playgroud) 当我使用我的应用程序一段时间后,我收到以下错误.通常需要50到100次动作才能导致坠机.虽然我正在使用故事板,但我没有理解它,这是一个NIB错误.
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason:
'Could not load NIB in bundle: 'NSBundle
</Users/me/Library/Application Support/iPhone Simulator/5.0/Applications/GUID/appname.app>
(loaded)' with name 'MainStoryboard_iPhone.storyboardc/q8p-MH-tsT-view-acD-hJ-g0C''
Run Code Online (Sandbox Code Playgroud)
我不是100%肯定从哪里开始寻找,但我认为这意味着故事板是腐败的?
我查看了我的所有源代码,并且我没有任何字符串"nib",因此没有nibWithNibName调用等.我也没有MainWindow.xib,虽然我尝试创建一个.我不确定在使用故事板时是否可以将其设置为主界面.但.xcodeproj/project.pbxproj文件中有一个.nib引用:
/* Begin PBXBuildRule section */
148BDD4C14AE8D5E002C30ED /* PBXBuildRule */ = {
isa = PBXBuildRule;
compilerSpec = com.apple.compilers.proxy.script;
fileType = wrapper.nib;
isEditable = 1;
outputFiles = (
);
script = "$(DEVELOPER_BIN_DIR)/ibtool\n";
};
Run Code Online (Sandbox Code Playgroud)
我在Xcode 4.2中使用故事板.我的主要故事板设置为MainStoryboard_iPhone,其文件名为MainStoryboard_iPhone.storyboard.
崩溃发生在iOS 5模拟器中.
编辑:我想而不是下面的长解释我也可能会问:发送-setNeedsDisplay
到一个实例CAEAGLLayer
不会导致图层重绘(即,-drawInContext:
不被调用).相反,我得到这个控制台消息:
Run Code Online (Sandbox Code Playgroud)<GLLayer: 0x4d500b0>: calling -display has no effect.
有没有解决这个问题的方法?我可以在调用-drawInContext:
时-setNeedsDisplay
调用吗?下面详细解释:
我有一个OpenGL场景,我想使用Core Animation动画制作动画.
遵循在CALayer中设置自定义属性动画的标准方法,我创建了一个子类,CAEAGLLayer
并sceneCenterPoint
在其中定义了一个属性,其值应该是动画的.我的图层还包含对OpenGL渲染器的引用:
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import "ES2Renderer.h"
@interface GLLayer : CAEAGLLayer
{
ES2Renderer *renderer;
}
@property (nonatomic, retain) ES2Renderer *renderer;
@property (nonatomic, assign) CGPoint sceneCenterPoint;
Run Code Online (Sandbox Code Playgroud)
然后我声明属性@dynamic
让CA创建访问器,覆盖+needsDisplayForKey:
并实现-drawInContext:
将sceneCenterPoint
属性的当前值传递给渲染器并要求它渲染场景:
#import "GLLayer.h"
@implementation GLLayer
@synthesize renderer;
@dynamic sceneCenterPoint;
+ (BOOL) needsDisplayForKey:(NSString *)key
{
if ([key isEqualToString:@"sceneCenterPoint"]) {
return YES;
} …
Run Code Online (Sandbox Code Playgroud) 正如WWDC 2014会话 225(核心数据中的新增内容)中所述,iOS 8和OS X Yosemite上的核心数据现在支持命令行参数,-com.apple.CoreData.ConcurrencyDebug 1
以启用检测违反Core Data并发协议的断言.
在我的实验中,我发现它可以在iOS 8 beta 1下运行(在设备和模拟器中),但我似乎发现了一个误报,即框架抛出多线程违例异常应该在哪里不这样做.至少这就是我所相信的.
问题:下面的代码是正确的还是我做了违反Core Data线程模型的事情?
我所做的是建立一个非常简单的Core Data堆栈(带有内存存储,为简单起见),使用一个backgroundContext
以私有队列并发命名的托管对象上下文.然后我调用performBlockAndWait { }
该上下文并在块中创建一个新的托管对象,将其插入上下文中,然后保存.
保存操作是我从Core Data获取多线程违例异常的地方.
var backgroundContext: NSManagedObjectContext?
func setupCoreDataStackAndViolateThreadingContract()
{
let objectModelURL = NSBundle.mainBundle().URLForResource("CoreDataDebugging", withExtension: "momd")
let objectModel: NSManagedObjectModel? = NSManagedObjectModel(contentsOfURL: objectModelURL)
assert(objectModel)
// Set up a simple in-memory Store (without error handling)
let storeCoordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: objectModel)
assert(storeCoordinator)
let store: NSPersistentStore? = storeCoordinator!.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil, error: nil)
assert(store)
// Set up …
Run Code Online (Sandbox Code Playgroud) 我是iOS开发人员.在iOS上,我们可以applicationSignificantTimeChange:
在我们的app委托中实现该方法,或者注册UIApplicationSignificantTimeChangeNotification
通知以响应系统时间的变化.
我似乎无法在Mac上找到同等产品.如何在macOS中观察系统时间的显着变化(例如:用户更改时间(区域),从/到夏令时切换)(除了启动每秒触发一次的计时器)?
截至2011年10月10日,Facebook iOS SDK再次支持"apprequests"对话框,用于从本机iOS应用程序发送用户对用户请求(请参阅Facebook开发人员文档中的屏幕截图).
但是,与通过Javascript调用的apprequests对话框相比,缺少的一件事是,可以启用所谓的无摩擦请求(请参阅有关页面中间的无摩擦请求部分),即用户允许应用程序的能力通过在首先弹出对话框时选中复选框,每次都不会弹出对话框来发送用户到用户的请求.
问题:有没有办法为本机iOS应用程序启用无摩擦请求.
ios ×8
iphone ×4
animation ×2
swift ×2
xcode ×2
apprequests ×1
cashapelayer ×1
cocoa ×1
cocoa-touch ×1
compilation ×1
core-data ×1
date ×1
datetime ×1
dialog ×1
facebook ×1
ios8 ×1
ipad ×1
macos ×1
opengl-es ×1
time ×1
touch-id ×1
uistoryboard ×1