小编Fit*_*rst的帖子

Objective C to Swift包含多个目标的头文件

我通过import语句成功地从Objective C(针对目标'MyApp')调用我的Swift类:

#import "MyApp-Swift.h"
Run Code Online (Sandbox Code Playgroud)

我现在创建了一个名为"MyAppLite"的新目标

当我编译新目标时,我得到错误,因为代码需要"MyApp-Swift.h",但编译器正在创建"MyAppLite-Swift.h"

所以,我需要为#import我正在编译的目标创建一个条件Swift/ObjC头.

如何做到这一点,还是有更好的方法?

objective-c header-files target swift

64
推荐指数
5
解决办法
2万
查看次数

并发UIAlertControllers

我正在将我的应用程序移植到iOS 8.0,并注意到UIAlertView已被弃用.

所以我改变了使用UIAlertController的东西.在大多数情况下都有效.

除了,当我的应用程序打开时,它会进行多次检查以向用户报告各种状态...

例如.."警告,你没有设置X并且在完成项目之前需要做Y"和"警告,你正在使用测试版并且不依赖于结果"等......(这些只是示例!)

在UIAlertView下,我会(比如说)同时获得两个警告框,用户必须点击两次才能解除两个...但它们都出现了.

在UIAlertController下面,使用下面的代码来显示"常规"警报,我只收到一条警报消息以及一条控制台消息:

警告:尝试在TestViewController上呈现UIAlertController:0x13f667bb0:0x13f63cb40已经呈现UIAlertController:0x13f54edf0

所以,虽然上面可能不是一个很好的例子,但我想有时可能需要在操作应用程序时因"事件"而提出多个全局警报.在旧的UIAlertView下,它们会出现,但似乎它们不会在UIAlertController下.

任何人都可以建议如何使用UIAlertController实现这一目标?

谢谢

+(void)presentAlert:(NSString*)alertMessage withTitle:(NSString*)title
{
    UIAlertController *alertView = [UIAlertController
                                    alertControllerWithTitle:title
                                    message:alertMessage
                                    preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* ok = [UIAlertAction
                         actionWithTitle:kOkButtonTitle
                         style:UIAlertActionStyleDefault
                         handler:^(UIAlertAction * action)
                         {
                             //Do some thing here
                             [alertView dismissViewControllerAnimated:YES completion:nil];
                         }];

    [alertView addAction:ok];

    UIViewController *rootViewController = [[[UIApplication sharedApplication] delegate] window].rootViewController;
    [rootViewController presentViewController:alertView animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

编辑:我注意到在iOS8上,连续呈现两个AlertViews,它们"排队"并按顺序出现,而在iOS7中,它们同时出现.似乎Apple已经改变了UIAlertView来排队多个实例.是否有办法使用UIAlertController执行此操作而不继续使用(已弃用但已修改)UIAlertView ???

uialertview ipad ios8 uialertcontroller

15
推荐指数
1
解决办法
5513
查看次数

iOS viewWillTransitionToSize和设备方向

我正在使用viewWillTransitionToSize来检测设备何时旋转到横向.根据目标大小,我可以检测是否前往景观并根据需要调整我的特征......

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    if size.width > size.height {
        self.setOverrideTraitCollection(UITraitCollection(horizontalSizeClass: UIUserInterfaceSizeClass.Regular), forChildViewController: viewController)
    }
    else{
        self.setOverrideTraitCollection(nil, forChildViewController: viewController)
    }

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够检测我的设备是转换到横向左侧还是横向右侧.这将允许我根据设备的具体方向创建不同的行为或视图.(左还是右).

这可能不使用任何已弃用的函数吗?

我想过使用状态栏方向......

    let orientation = UIApplication.sharedApplication().statusBarOrientation;
    if( orientation == UIInterfaceOrientation.LandscapeLeft )
    {
        // Do something
    }
    else if( orientation == UIInterfaceOrientation.LandscapeRight )
    {
        // Do something else
    }
Run Code Online (Sandbox Code Playgroud)

...但这没有用,因为这似乎给出了"旧的"状态方向.

如何获得特定的目标定位?

iphone orientation screen-orientation ios size-classes

13
推荐指数
2
解决办法
5193
查看次数

单线程保存上的iOS7 NSMergeConflict

在重新排序两行之后,在单个线程应用程序上存在简单数据保存问题.

我已经设法简化编码以重现错误,并希望与其他人一起尝试这一点的第二意见.

这是一个完整性检查,因为我怀疑iOS 7引入的核心数据问题,因为这在iOS 6中运行正常.

首先,启动一个新的核心数据项目并创建这个模型......

简单的核心数据模型

属性"current"是一个可选的布尔值.一对多关系是有序关系,创建NSOrderedDataset.

现在为应用添加几个按钮; 第一个创建数据(一个项目和两个相关的'图纸'),第二个交换两个图纸,然后在第一个图纸中设置一个属性.

这是代码......

-(IBAction)onTestButton:(id)sender
{
    id delegate = [[UIApplication sharedApplication]delegate];
    NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext];

    self.project = [NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:managedObjectContext];
    Drawing *drawing1 = [NSEntityDescription insertNewObjectForEntityForName:@"Drawing" inManagedObjectContext:managedObjectContext];
    Drawing *drawing2 = [NSEntityDescription insertNewObjectForEntityForName:@"Drawing" inManagedObjectContext:managedObjectContext];

    NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.project.drawings];
    [tempSet addObject:drawing1];
    [tempSet addObject:drawing2];
    self.project.drawings = tempSet;

    [self save];
}

-(IBAction)onTestButton2:(id)sender
{
    NSMutableOrderedSet *exchange = [self.project mutableOrderedSetValueForKey:@"drawings"];
    [exchange exchangeObjectAtIndex:0 withObjectAtIndex:1];
    self.project.drawings = exchange;

    [self save];

    Drawing *drawing = [self.project.drawings objectAtIndex:0];

    BOOL current = [drawing.current boolValue];
    drawing.current …
Run Code Online (Sandbox Code Playgroud)

iphone core-data ipad ios ios7

8
推荐指数
1
解决办法
1699
查看次数

后台线程上的drawViewHierarchyInRect

我正在尝试在后台线程上进行一些"屏幕外渲染",以更新我正在创建的类似设计器的应用程序的预览.

我已经使用renderInContextNSOperationQueue派生的队列来实现这一点,但请注意它很慢.

所以,我已经开始使用drawViewHierarchyInRect哪个效果很好而且速度更快.但是,我注意到当这个方法以b/g运行时,我的UI完全阻塞.

如果我在主线程上这样做...

    UIView *preview = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
    preview.backgroundColor = [UIColor redColor];

    UIGraphicsBeginImageContextWithOptions(preview.bounds.size, NO, 0.0);

    BOOL ok = [preview drawViewHierarchyInRect:preview.bounds afterScreenUpdates:YES];

    UIImage *img = nil;

    if( ok )
    {
        img = UIGraphicsGetImageFromCurrentImageContext();
    }

    UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)

......一切正常.

但是,如果我(比如说)派遣这个......

if (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW) == 0) 
{
    dispatch_async(renderQueue, ^{
        // capture
        UIView *preview = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
        preview.backgroundColor = [UIColor redColor];

        UIGraphicsBeginImageContextWithOptions(preview.bounds.size, NO, 0.0);

        BOOL ok = [preview drawViewHierarchyInRect:preview.bounds afterScreenUpdates:YES];

        UIImage *img = nil;

        if( …
Run Code Online (Sandbox Code Playgroud)

multithreading screenshot uiview ios

8
推荐指数
1
解决办法
2074
查看次数

Swift使用字符串参数断言

为什么在Swift这是合法的......

assert( false, "Unexpected diagnosis: \(diagnosis)" );
Run Code Online (Sandbox Code Playgroud)

这不是吗?

let assertString = "Unexpected diagnosis: \(diagnosis)"
assert( false, assertString );
Run Code Online (Sandbox Code Playgroud)

在第二个片段中,我收到错误...

无法使用类型'的参数列表调用'assert'(BooleanLiteralConvertible,String)

当然,第二个参数在两种情况下都是一个字符串.

parameters assert swift

6
推荐指数
1
解决办法
1719
查看次数

从基类扩展委托

我有一个objc基类:

@protocol BaseClassDelegate;

@interface BaseClass : NSObject

@property (nonatomic, weak) id <BaseClassDelegate> delegate;

@end

@protocol BaseClassDelegate <NSObject>

-(void)baseDelegateMethod;

@end
Run Code Online (Sandbox Code Playgroud)

我正在创建一个快速的子类,我想在其中扩展我的代理...

protocol SubClassDelegate : BaseClassDelegate {

    func additionalSubClassDelegateMethod();
}

class SubClass: BaseClass {

    @IBAction func onDoSomething(sender: AnyObject) {

        delegate?.additionalSubClassDelegateMethod();  <--- No such method in 'delegate'
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我创建我的子类时,我可以说它符合SubClassDelegate并设置委托.问题是(当然),这个子类中不存在'委托'.有没有办法告诉编译器将我的委托"扩展"到我的子类中?(或者我在这里疯了,错过了一些明显的东西)

delegates objective-c extend ios swift

5
推荐指数
2
解决办法
4596
查看次数

iOS Swift和reloadRowsAtIndexPaths编译错误

我用xCode/Swift打了一个死锁并刷新了一行UITableView.

这条线有效......

self.tableView.reloadData();
Run Code Online (Sandbox Code Playgroud)

而这条线却没有

self.tableView.reloadRowsAtIndexPaths([_currentIndexPath], withRowAnimation: UITableViewRowAnimation.None);
Run Code Online (Sandbox Code Playgroud)

自动完成建议reloadRowsAtIndexPaths并给出语法,但在编译时,我收到错误:

'无法找到成员'reloadRowsAtIndexPaths'.

如果我右键单击并在' jump to definition'中self.tableview,则找不到符号.

我希望我在这里做任何令人尴尬的愚蠢行为并希望得到帮助.我可以使用,reloadData但想知道为什么这不起作用.

reload uitableview ios swift

4
推荐指数
1
解决办法
9610
查看次数

iOS8.1核心数据轻量级+重量级迁移

我有我的核心数据库的第1版.(简化示例)

在此输入图像描述

我对模型进行了一些更改,制作了V2.这涉及创建具有type属性加上其他一些的新实体.该类型属性是链接到该的实体. 在此输入图像描述

我的应用程序的新版本已发布,数据迁移正常,因为它是轻量级的.出于我自己的原因,我此时没有建立关系.

一段时间后,我决定对结构做一些更大的改动,创建新的实体FixtureTypePlateTypeImage.然后我创建了一些关系.这给了我模特的V3.

在此输入图像描述

由于这种修改的性质,我需要进行从V2到V3的重量级迁移,包括复制属性数据,填充新属性以及设置关系.因此,我设置了一个映射模型,创建了必要的迁移策略并点击了go按钮.

这适用于V2到V3但是当测试从V1到V3的迁移时,我得到一系列错误......,例如

reason =无法就地迁移存储:验证错误缺少必需目标关系上的属性值

我正在使用以下PSC选项:

NSDictionary *options = @{
                          NSMigratePersistentStoresAutomaticallyOption : @YES,
                          NSInferMappingModelAutomaticallyOption : @YES
                          };


if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
Run Code Online (Sandbox Code Playgroud)

那么,我的查询是核心数据如何迁移数据?它是顺序的,所以我从V1到V2轻量级迁移,然后重量级V2到V3,还是从V1迁移到V3?如果是这样,我是否需要为V1到V3创建迁移策略(让事情变得笨拙以便涵盖所有组合)?

此外,一旦我开始使用重量级,我现在失去了轻量级迁移设施吗?

建议和意见表示赞赏.

macos core-data core-data-migration ios

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

NSStandardUserDefaults上的iOS/Swift 1.2 NSDictionray/Dictionary

在'旧'Swift中,我曾经注册过从.plist文件中加载的默认值...

let prefs = NSBundle.mainBundle().pathForResource("UserDefaults", ofType: "plist");
let dict = NSDictionary(contentsOfFile: prefs!);
let defaults:NSDictionary! = dict?.valueForKey("defaults") as! NSDictionary;

NSUserDefaults.standardUserDefaults().registerDefaults(defaults);
NSUserDefaults.standardUserDefaults().synchronize();
Run Code Online (Sandbox Code Playgroud)

在Swift 1.2下,我收到错误...

无法使用类型'(NSDictionary!)'的参数列表调用'registerDefaults'

所以,有些东西发生了变化,Swift不再接受NSDictionary作为registerDefaults的参数.

那么,我怎样才能将我的NSDictionary转换为Dictionary对象,因为它们不再可以互换?

dictionary nsdictionary nsuserdefaults ios swift

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

ios8隐藏/显示导航栏和工具栏

iOS 8.2 - iPad或iPhone.

我正在Xcode中创建一个基本的Master-Detail应用程序来测试UISplitViewController.我正在从故事板中选择我的细节导航控制器并选择我想要显示工具栏.这出现在故事​​板中.

我还在属性窗口中选择了Tap on Tap Bars(如图所示).

在此输入图像描述

但是,当我运行应用程序时,只有我的导航栏出现/消失.工具栏在屏幕底部保持静态.即使我在代码中设置它,我的工具栏仍然是静态的.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    let splitViewController = self.window!.rootViewController as UISplitViewController
    let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as UINavigationController
    navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem()
    splitViewController.delegate = self

    navigationController.hidesBarsOnTap = true;
    return true
}
Run Code Online (Sandbox Code Playgroud)

然而,文档建议应该隐藏/显示两个条形.

讨论当此属性的值为YES时,导航控制器切换其导航栏和工具栏的隐藏和显示,以响应内容区域中的其他未处理的点击.此属性的默认值为NO.

此属性实际上是否在工具栏上有效?如果是这样,还有什么我应该做的吗?谢谢

iphone xcode toolbar uinavigationcontroller ios

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