2015-07-10 58 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() 
}