2015-07-10 31 views
1

我想将swift转换为objective-C。这里是我下面的代码:UITraitCollection - swift to objective-C

斯威夫特

import UIKit 

protocol TraitCollectionOverridable { 
    func preferredTraitCollection() -> UITraitCollection? 
} 

class CustomNavigationController: UINavigationController { 
    override func overrideTraitCollectionForChildViewController(childViewController: UIViewController) -> UITraitCollection? { 
     guard let conformingViewController = childViewController as? TraitCollectionOverridable else { 
      return super.overrideTraitCollectionForChildViewController(childViewController) 
     } 

     return conformingViewController.preferredTraitCollection() 
    } 
} 

Objective-C的 头文件

@protocol TraitCollectionOverridable <NSObject> 
- (UITraitCollection *) preferredTraitCollection; 
@end 

@interface CustomNavigationController : UINavigationController 
@property (nonatomic, weak) id <TraitCollectionOverridable> traitsDelegate; 
@end 

.m文件

@implementation CustomNavigationController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.traitsDelegate preferredTraitCollection]; 
    // Do any additional setup after loading the view. 
} 


- (UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController 
{ 
    if (CGRectGetWidth(self.view.bounds) < CGRectGetHeight(self.view.bounds)) { 
     return [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact]; 
    } else { 
     return [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular]; 
    } 
} 

@end 

我的猜测是overrideTr aitCollectionForChildViewController未正确转换。任何帮助都很好。

回答

1

我的猜测是overrideTraitCollectionForChildViewController未正确转换。

的OBJ-C & 夫特版本overrideTraitCollectionForChildViewController是不等价的。这里是校正代码:

的OBJ-C

- (UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController 
{ 
    if([childViewController conformsToProtocol:@protocol(TraitCollectionOverridable)]) { 
     return [(NSObject<TraitCollectionOverridable>*)childViewController preferredTraitCollection]; 
    } else { 
     return [super overrideTraitCollectionForChildViewController:childViewController]; 
    } 
} 

夫特
override func overrideTraitCollectionForChildViewController(childViewController: UIViewController) -> UITraitCollection? { 
    guard let conformingViewController = childViewController as? TraitCollectionOverridable else { 
     return super.overrideTraitCollectionForChildViewController(childViewController) 
    } 

    return conformingViewController.preferredTraitCollection() 
}