当想要在通用应用程序中支持 iOS 4 及更高版本(对于 iPhone 3G)时,是否有更短的方法来呈现 View Controller ?
目前我在下面有这个,但我不喜欢我需要一个 UIPopoverController 属性,我特别需要它,因为如果 View Controller 用于选择图像,那么当选择图像时,需要关闭弹出窗口。
@interface SASuccessViewController ()
@property (nonatomic, retain) UIPopoverController *myPopoverController;
@end
@implementation SASuccessViewController
-(void)showViewController:(UIBarButtonItem *)sender {
UIViewController *viewController = [[UIViewController alloc] init];
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
[self presentViewController:viewController animated:NO completion:nil];//iOS 5 and above
} else {
[self presentModalViewController:viewController animated:NO]; //iOS 4, deprecated in iOS 6
}
} else {
if (!self.myPopoverController) {
self.myPopoverController = [[[UIPopoverController alloc] initWithContentViewController:viewController] autorelease];
} else {
[self.myPopoverController setContentViewController:viewController];
}
[self.myPopoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
[viewController release];
}
-(void)dealloc {
[_popoverController release];
[super dealloc];
}
@end
考虑到当 iOS 4 是最新版本(并且不是通用应用程序)时,方法就是:
-(void)showViewController:(UIBarButtonItem *)sender {
UIViewController *viewController = [[UIViewController alloc] init];
[self presentModalViewController:viewController animated:NO];
[viewController release];
}
我现在所拥有的看起来相当臃肿。有没有更好的方法在通用应用程序上显示 View Controller (更不用说支持 iOS 4)?
最佳答案
不幸的是,没有更好的方法在通用应用程序中呈现模态视图。你所拥有的逻辑是非常必要的。不过,这里有一些提示:
考虑到您没有指定完成 block ,在您删除对 iOS 4.0 的支持之前,可能可以继续使用已弃用的
presentViewController:animated:
方法。换句话说,你可以这样做:if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { [self presentModalViewController:viewController animated:NO]; }
或者,正如其他人所说,您可以为presentModalViewController 方法创建一个UIViewController 类别。至少这会清理你的 UIViewController 一点。
如果您的 SASuccessViewController 直接继承自 UIViewController,您可能会考虑创建另一个 UIViewController 供 SASuccessViewController 继承。例如,MasterViewController 可以是您的任何 View Controller 都可以继承的 View Controller 。这里的想法是通过将代码移动到父类(super class)来清理 View Controller ,同时消除在不同 View Controller 中呈现模态 Controller 时的代码重复。
@interface MasterViewController () @property (nonatomic, retain) UIPopoverController *popoverController; - (void)presentViewController:(UIViewController *)viewController origin:(id)origin; @end @implementation MasterViewController @synthesize popoverController; - (void)presentViewController:(UIViewController *)viewController origin:(id)origin { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) { [self presentViewController:viewController animated:NO completion:nil];//iOS 5 and above } else { [self presentModalViewController:viewController animated:NO]; //iOS 4, deprecated in iOS 6 } } else { if (!self.popoverController) { self.popoverController = [[[UIPopoverController alloc] initWithContentViewController:viewController] autorelease]; } else { [self.popoverController setContentViewController:viewController]; } if(![self.popoverController isPopoverVisible]) { if([origin isKindOfClass:[UIBarButtonItem class]]) { [self.popoverController presentPopoverFromBarButtonItem:origin permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } else { [self.popoverController presentPopoverFromRect:CGRectZero inView:origin permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } } } } @end
然后您可以从您的 SASuccessViewController
执行此操作:
-(void)showViewController:(UIBarButtonItem *)sender {
[self presentViewController:x origin:sender];
}
关于iphone - 在通用应用程序中呈现 View Controller ,iOS 4 到 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12788912/