iphone - 在通用应用程序中呈现 View Controller ,iOS 4 到 6

标签 iphone objective-c uiviewcontroller modalviewcontroller

当想要在通用应用程序中支持 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)?

最佳答案

不幸的是,没有更好的方法在通用应用程序中呈现模态视图。你所拥有的逻辑是非常必要的。不过,这里有一些提示:

  1. 考虑到您没有指定完成 block ,在您删除对 iOS 4.0 的支持之前,可能可以继续使用已弃用的 presentViewController:animated: 方法。换句话说,你可以这样做:

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self presentModalViewController:viewController animated:NO];        
    }
    
  2. 或者,正如其他人所说,您可以为presentModalViewController 方法创建一个UIViewController 类别。至少这会清理你的 UIViewController 一点。

  3. 如果您的 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/

相关文章:

objective-c - 如何在 macOS 中获取用户特殊文件夹的路径?

ios - Cocos2d-iphone - Sphero 集成

ios - 需要从呈现的 UINavigationController 中返回到呈现的 UIViewController

iphone - 将 ios 应用程序部署到不同状态的 12-15 部 iPhone 的最快方法是什么?

iphone - map 套件 :How to add annotation on MKLocalSearch results placemarks?

iphone - 在 iPhone 屏幕上绘图时识别图案

ipad - 当键盘出现在带有 iOS8 的 iPad 上时,将模态呈现的 UIViewController 向上移动

iOs - 无法识别的选择器发送到 TextAction 上的实例

ios - 在我的应用程序中多次使用相同的代码

objective-c - 在 OS X 的停靠栏上下文菜单中显示图标?