使用最新版本的可可豆荚(0.36),我能够将swift(例如Alamofire)中的可可豆荚嵌入我的快速项目中.现在我将自己的自定义框架引入到项目中,该框架也希望依赖于Alamofire.
为了实现这一点,我所做的是选择将pods框架添加到我的框架作为依赖:
为我自己的嵌入式Swift框架(Swift模块)选择Target,在"Linked frameworks and libraries"的"General"选项卡中,我将"Pods.framework"添加为"Required".
但是,这还不足以编译,因为我自己的swift框架中的类不能"导入Alamofire",因为它不被认为是"可用框架".
将Pods.debug.xcconfig和Pods.release.xcconfig文件添加到我自己的swift框架的目标的配置中,换句话说,更改构建设置以执行所有更改,可可豆荚对我的构建设置执行iOS App目标,解决了这个问题.
它现在构建没有问题.它也在模拟器中运行没有问题,我自己的嵌入式swift框架成功地使用了由cocoa pods添加的框架.
但是,如果我在设备上运行相同的程序,它会毫无问题地进行编译和安装,但在启动时会出现致命错误:
dyld: Library not loaded: @rpath/Pods.framework/Pods
Referenced from: /private/var/mobile/Containers/Bundle/Application/32D2F1F8-679F-4A5F-8159-28F1C800D0C6/TestingFrameworks.app/Frameworks/mySwiftFramework.framework/mySwiftFramework
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
显然,并非cocoa pods xcconfig文件中的所有设置都适合添加到我的自定义swift框架的构建设置中.
但为什么它在模拟器中工作呢?更重要的是构建设置是什么,我需要纠正?
对我来说,我似乎需要更改此构建设置:
PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods
Run Code Online (Sandbox Code Playgroud)
别的......
我在我的App中实现了一个自定义的UIViewController Transition,它取代了推送动画中内置的导航控制器.
到目前为止一切都有效,除了新推出的视图控制器中的toplayoutguide为0,尽管新视图控制器从旧视图控制器继承了导航栏.它应该是64.0(状态栏高度+导航栏高度),现在它是0.0.因此,附加到故事板中顶部布局指南的所有对象现在显示为64点太高(在半透明条下方).
当我禁用自定义视图转换时,顶部布局指南将具有预期值.我试图"遍布整个地方"调用layoutSubviews和updateConstraints.在视图控制器以及导航控制器中.
据我所知,navigationcontroller(parentviewcontroller)应更新新视图控制器的toplayoutguide,但显然我在自定义转换代码中遗漏了一些内容,这会触发更新为toplayoutguide的正确值.
这是我的自定义转换代码,它是一个设置为navigationcontroller委托的对象:
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
return 0.7;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIView *animationContainerView = [transitionContext containerView];
UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *toView = [toVC view];
UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIView *fromView = [fromVC view];
CGRect endFrame = [transitionContext finalFrameForViewController:toVC];
CGRect startFrame;
startFrame = CGRectOffset(endFrame, 0, endFrame.size.height);
if (self.operation == UINavigationControllerOperationPop) {
[animationContainerView insertSubview:toView belowSubview:fromView];
[toView setFrame:endFrame];
}
else{
[toView setFrame:startFrame];
[animationContainerView insertSubview:toView aboveSubview:fromView];
}
[UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 usingSpringWithDamping:0.7 initialSpringVelocity:0.8 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
if (self.operation …Run Code Online (Sandbox Code Playgroud) 是否可以在swift中的扩展中定义类函数,就像在Objective-C类中一样,您还可以定义类函数?
objective-c中的示例
@implementation UIColor (Additions)
+ (UIColor)colorWithHexString:(NSString *)hexString
{
// create color from string
// ... some code
return newColor;
}
@end
Run Code Online (Sandbox Code Playgroud)
swift中的等价物是什么?
我试图在我的基于Swift的项目中使用RestKit.我似乎无法使用Swift原始数据类型,如Int,Double,Bool等,除了String,Array和Dictionaries(可能是因为它们是免费的桥接到NSString, NSArray和NSDictionary)
使用objective-c,我可以将对象中的属性定义为作为属性的基本数据类型,这些属性已分配.在Swift中,我只能使用对象(String,NSNumber,Array,Dictionary),否则应用程序会崩溃"setValue:forUndefinedKey:此类与密钥aBool不符合密钥值编码".
示例:这是我的对象在Objective-C中的样子:
@interface TestObject : NSObject
@property (strong, nonatomic) NSString *aString;
@property (assign, nonatomic) BOOL aBool;
@property (assign, nonatomic) CGFloat aFloat;
@end
Run Code Online (Sandbox Code Playgroud)
和Swift中的"等价物":
class TestObject:NSObject {
var aString:NSString?
var aBool:Bool?
var aFloat:Double?
}
Run Code Online (Sandbox Code Playgroud)
崩溃,虽然我明白为什么它会崩溃,我想知道,是否有另一种解决方法,而不是使用NSNumber for Booleans,Integers和Floats,就像它在Objective-C中一样?
(如果任何RestKit开发人员正在阅读此内容:首先感谢您的工作,然后:是否有关于Swift支持/端口到Swift的计划?)
我试图在可可豆荚设置的环境中创建一个带有可重用代码的swift模块(Cocoa Touch Framework),其中包括用Objective-C编写的第三方库(即Restkit).不幸的是,我无法在我创建的模块中使用Restkit.
这是我创建模块所做的:
文件 - >新目标:Cocoa Touch Framework,语言:Swift,项目:MyProject,嵌入应用程序:MyProject
在"配置"部分的项目设置的"信息"选项卡中,我为新创建的目标定义了Pods.debug和Pods.release xcconfig文件.
在头文件中,Xcode为我自动创建了networkModule.h,我添加了以下行:
#import <RestKit/RestKit.h>
结果:在尝试编译时,我得到错误"在框架模块'networkModule'中包含非模块化头"
我已在项目目标和模块/框架目标的构建设置中将"允许框架模块中的非模块化包含"标记设置为"是".
我去了Cocoa pod项目并尝试将RestKit.h头文件的可见性设置为目标成员中的"Public"(这当然不是解决可可pod环境的好方法)
我无法编译.我仍然得到同样的错误.
是否有可能首先创建一个依赖于cocoa pod托管框架的Cocoa Touch Framework?
顺便说一句.我创建一个私人可可豆荚的第一个想法也没有成功,因为它似乎没有得到支持,尽管我正在使用可可豆荚0.36的预发布,支持swift.
在Skeets的文档中,一个用swift for iOS/MacOS编写的图像加载器/缓存框架,一个例子展示了如何指定缓存路径.
//set the cache directory. Only have to do this once since `sharedManager` is a singleton
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
ImageManager.sharedManager.cache.diskDirectory = "\(paths[0])/ImageCache"
Run Code Online (Sandbox Code Playgroud)
直到现在我的理解是,文档目录(及其子目录)不是存储缓存数据的正确选择,它甚至导致应用程序审核过程失败,因为文档目录被备份到iCloud缓存数据没什么,我们真的想在云中备份.
当然,除非我们明确地从iCloud备份中排除我们指定的目录.
我以为NSSearchPathDirectory.CachesDirectory将是存储缓存数据的适当位置?
ios ×5
swift ×5
cocoapods ×2
caching ×1
frameworks ×1
ios7 ×1
iphone ×1
objective-c ×1
restkit ×1
xcode ×1