小编Ole*_*ann的帖子

将数组传递给Swift中具有可变数量的args的函数

Swift编程语言中,它说:

函数也可以采用可变数量的参数,将它们收集到一个数组中.

  func sumOf(numbers: Int...) -> Int {
      ...
  }
Run Code Online (Sandbox Code Playgroud)

当我用逗号分隔的数字列表(`sumOf(1,2,3,4))调用这样的函数时,它们可以作为函数内的数组使用.

问:如果我已经有一个数字数组要传递给这个函数怎么办?

let numbers = [1, 2, 3, 4]
sumOf(numbers)
Run Code Online (Sandbox Code Playgroud)

这会因编译器错误而失败,"无法找到接受所提供参数的'__conversion'的重载".有没有办法将现有数组转换为可以传递给可变函数的元素列表?

variadic-functions swift

141
推荐指数
4
解决办法
7万
查看次数

动画边界上的CAShapeLayer路径动画更改

我有一个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)

animation core-animation cashapelayer ios

40
推荐指数
1
解决办法
1万
查看次数

对应应用程序:openURL:sourceApplication:annotation:

iOS SDK 4.2包含一个UIApplicationDelegate名为的新方法application:openURL:sourceApplication:annotation:.它是application:handleOpenURL:对调用应用程序的替代和提供更多信息:我们不仅获取调用应用程序的包标识符,而且还在annotation参数中,

源应用程序提供的属性列表对象,用于将信息传递给接收应用程序.

太棒了,这应该为多个第三方应用之间更直接的互动提供了很多机会!

唯一的问题是:如何在调用应用程序一侧调用此机制?-[UIApplication openURL:]似乎没有改变,也没有提供任何方法来传递属性列表和URL.你知道调用应用程序如何用iOS SDK 4.2做到这一点吗?

iphone cocoa-touch uiapplicationdelegate ipad ios

19
推荐指数
1
解决办法
5031
查看次数

插入单元格时动画UICollectionView框架更改

我想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,它表现出相同的行为.

animation uiviewanimation ios uicollectionview

19
推荐指数
2
解决办法
4132
查看次数

touchIDLockout在iOS 11.0中已弃用

使用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中尝试过):

  1. 创建一个新的iOS应用程序(单一视图模板).请注意,iOS部署目标设置为iOS 11.2.
  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)
  3. 构建应用程序.

let _: LAError? = nil行足以显示三个警告.但是,警告与任何特定代码行都没有关联.它们出现在构建日志中,没有任何文件/行引用:

<unknown>:0: warning: 'touchIDLockout' was …
Run Code Online (Sandbox Code Playgroud)

xcode compilation ios touch-id swift

19
推荐指数
3
解决办法
3971
查看次数

无法在捆绑中加载NIB:'NSBundle使用故事板时

当我使用我的应用程序一段时间后,我收到以下错误.通常需要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模拟器中.

iphone xcode ios uistoryboard

16
推荐指数
2
解决办法
1万
查看次数

将核心动画与OpenGL ES相结合

编辑:我想而不是下面的长解释我也可能会问:发送-setNeedsDisplay到一个实例CAEAGLLayer不会导致图层重绘(即,-drawInContext:不被调用).相反,我得到这个控制台消息:

<GLLayer: 0x4d500b0>: calling -display has no effect.
Run Code Online (Sandbox Code Playgroud)

有没有解决这个问题的方法?我可以在调用-drawInContext:-setNeedsDisplay调用吗?下面详细解释:


我有一个OpenGL场景,我想使用Core Animation动画制作动画.

遵循在CALayer中设置自定义属性动画的标准方法,我创建了一个子类,CAEAGLLayersceneCenterPoint在其中定义了一个属性,其值应该是动画的.我的图层还包含对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)

iphone core-animation opengl-es ios

11
推荐指数
2
解决办法
3543
查看次数

核心数据并发调试:误报

正如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)

multithreading core-data ios ios8

10
推荐指数
1
解决办法
2240
查看次数

观察macOS中系统日期/时间的变化

我是iOS开发人员.在iOS上,我们可以applicationSignificantTimeChange:在我们的app委托中实现该方法,或者注册UIApplicationSignificantTimeChangeNotification通知以响应系统时间的变化.

我似乎无法在Mac上找到同等产品.如何在macOS中观察系统时间的显着变化(例如:用户更改时间(区域),从/到夏令时切换)(除了启动每秒触发一次的计时器)?

macos time cocoa datetime date

9
推荐指数
1
解决办法
2112
查看次数

Facebook请求对话框:本机iOS应用程序中的无摩擦请求可能吗?

截至2011年10月10日,Facebook iOS SDK再次支持"apprequests"对话框,用于从本机iOS应用程序发送用户对用户请求(请参阅Facebook开发人员文档中屏幕截图).

但是,与通过Javascript调用的apprequests对话框相比,缺少的一件事是,可以启用所谓的无摩擦请求(请参阅有关页面中间的无摩擦请求部分),即用户允许应用程序的能力通过在首先弹出对话框时选中复选框,每次都不会弹出对话框来发送用户到用户的请求.

问题:有没有办法为本机iOS应用程序启用无摩擦请求.

iphone facebook dialog ios apprequests

9
推荐指数
1
解决办法
5380
查看次数