2

ユニバーサル アプリで iOS 4 以降 (iPhone 3G の場合) をサポートしたい場合、View Controller を表示するより短い方法はありますか?

現在、私はこれを以下に持っていますが、特にView Controllerが画像を選択するためのものである場合、画像が選択されたときにポップオーバーを閉じる必要があるため、UIPopoverControllerプロパティが必要な方法が嫌いです。

@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];
}

私が今持っているものはかなり肥大化しているようです。ユニバーサル アプリ (iOS 4 のサポートは言うまでもなく) でビュー コントローラーを表示するより良い方法はありますか?

4

3 に答える 3

1

残念ながら、ユニバーサル アプリでモーダル ビューを表示するより良い方法はありません。あなたが持っているロジックはすべてかなり必要です。ただし、いくつかのヒントがあります。

  1. presentViewController:animated:完了ブロックを指定していないことを考えると、iOS 4.0 のサポートを削除するまでは、非推奨の方法に固執しても問題ないでしょう。言い換えれば、これを行うことができます:

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self presentModalViewController:viewController animated:NO];        
    }
    
  2. または、他の誰かが述べたように、presentModalViewController メソッドの UIViewController カテゴリを作成することもできます。少なくともこれにより、UIViewController が少しクリーンアップされます。

  3. SASuccessViewController が UIViewController から直接継承する場合は、継承元の SASuccessViewController 用に別の UIViewController を作成することを検討してください。たとえば、MasterViewController は、View Controller のいずれかが継承できる View 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];
}
于 2012-10-17T15:09:16.180 に答える
1

これを行うには、UIViewController にカテゴリを記述できます。

@implementation UIViewController (PresentViewController)

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;

@end

@interface UIViewController (PresentViewController)

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    if([super respondsToSelector:@selector(presentViewController:animated:completion:)]){
        [super presentViewController:viewControllerToPresent animated:flag completion:completion];
    } else {
        [super presentModalViewController:viewControllerToPresent animated:flag];
    }
}
于 2012-10-17T00:47:32.587 に答える
0

のインスタンスを作成しUIViewController、モーダル プレゼンテーション スタイルをUIModalPresentationStyleformsheet または currentContextに設定することができますtransitionStyle。これで問題が解決することを願っています。

        UIViewController *viewController = [[UIViewController alloc] init];
        [viewController setModalPresentationStyle:UIModalPresentationFormSheet];
        [viewController setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];            
        [self presentViewController:viewController animated:YES completion:nil];

したがって、ios4 で動作しない場合は、モーダル ビュー コントローラーとして直接使用できます。

于 2012-10-11T04:41:12.623 に答える