2016-01-04 10 views
12

私はこのようなUIAlertViewController実装したいと思います(参考:PagesとKeynoteのアプリを):UITableViewを使用してUIAlertControllerをカスタマイズする方法や、このUIのようなPagesアプリケーションで使用できるデフォルトのコントロールはありますか?

enter image description here

私はカスタムテーブルビューを実装し、UIAlertViewControllerを模倣してビューを提示しました。しかし、私は上記と同様のUIを達成することはできません。これに使用できるデフォルトコントローラはありますか?

-(void)share:(id)sender 
{ 
    [self setModalPresentationStyle:UIModalPresentationCurrentContext]; 

    AlertViewController *renameCntrl = [self.storyboard instantiateViewControllerWithIdentifier:AlertTblViewidentifier]; 
    renameCntrl.optionViewDelegate = self; 
    renameCntrl.providesPresentationContextTransitionStyle = YES; 
    renameCntrl.definesPresentationContext = YES; 
    [renameCntrl setModalPresentationStyle:UIModalPresentationOverCurrentContext]; 
    [self presentViewController:renameCntrl animated:YES completion:nil]; 
} 
+0

uialertviewcontrollerからuitableviewをポップするには、とにかくあります。 – SMS

+0

あなたはUITableViewだけでこの機能を実現したいです。 – Ricky

+0

私の答えを見てください。私はこれを複数回実装しており、とても簡単です。 –

答えて

5

UIAlertControllerには、UIViewControllerサブクラスをアラートコントローラの一部として設定できるプライベートcontentViewControllerプロパティがあります。アクションシートまたは警告スタイルの両方でうまく機能します。コンテンツビューコントローラと他のアラートアクションを混在させることができます。

これは、UIActivityViewController、Airdropプレビューコントローラなどが実装されている方法です。

ベストプラクティスは、UIAlertController、とのいずれかinitWithNibName:bundle:またはviewDidLoadをサブクラスcontentViewControllerプロパティを設定するためにsetValue:forKey:を使用することです。コンテンツビューコントローラーにpreferredContentSizeを設定することを忘れないでください。レオの答えへに追加

+4

"ベストプラクティスは' UIAlertController'をサブクラス化することです "" ... uhhh、no。ドキュメントから: "UIAlertControllerクラスはそのまま使用するためのもので、サブクラス化をサポートしていません。" – Firo

+0

@FiroここでプライベートAPIについて話しています。私はそれがうまく動作することを証明することができます。 –

+4

私は決してそれがうまく動作しません。ちょうどそれを "ベストプラクティス"とは考えていないでしょう。 OPにプライベートAPIについて言及することはありません。それだけです。 – Firo

0

私はあなたがUIAlertControllerStyleActionSheetpreferredStyleセットでUIAlertControllerを使うべきだと思います。

しかし、これが最初から十分でない場合は、UIWindowUIViewControllerからtableViewを使用して、必要なUIを作成してください。カスタムalertView実装がたくさんあります。

+0

UIAlertcontroller、右のイメージでそれをカスタマイズする方法はありますか?私はすでにUIAlertcontrollerを試しましたが、同じ要件を達成できませんでした。それが私を助けることができるなら、私にいくつかのサンプルコードを教えてください。 – SMS

1

、はい、あなたはUIAlertControllerの内容として(と、それはビューの)UIViewControllerを設定することができますUIAlertControllercontentViewControllerのプライベートプロパティがあります。

あなたはKVOを使用してかそこらのようなプライベートヘッダをインポートせずに、このプロパティにアクセスするためのプライベートインターフェイスを作成することができます。

@interface UIAlertController (ContentViewController) 
@property (nonatomic, strong) UIViewController * contentViewController; 
@end 

その後、プログラムでInterface Builderのかを経由して、あなたのコンテンツビューコントローラのviewにカスタムビューをレイアウト。

また、あなたのビューコントローラのpreferredContentSizeをオーバーライドする必要があることを忘れないでください:

- (CGSize)preferredContentSize { 
    CGSize contentSize = [super preferredContentSize]; //gets the preferredContentHeight from the view, will be set depending on how much content we have 
    return CGSizeMake(contentSize.width, self.view.preferredContentHeight); 
} 

注:むしろゲッターをオーバーライドよりも、レオナタンは、それがUIViewControllerのプロパティであるため、直接preferredContentSizeの設定を示唆しています。

必要に応じて、サブクラス内のビューコントローラのviewも上書きすることができます。

カスタムビューを設定し
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" 
                        preferredStyle:UIAlertControllerStyleActionSheet]; 

[alertController setContentViewController:[[MyContentViewController alloc] init]]; 

があなたの行動を追加:あなたの通常と同じような本

[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^{ 
         NSLog(@"Cancel Button was pressed"); 
}]; 

をあなたが通常どおりにアラートを設定し

[self presentViewController:alertController animated:YES completion:nil]; 

UIAlertControllerのプライベートAPIの詳細は、iPhone Dev Wikiのarticle on UIAlertControllerにあります。

プライベートインターフェイスも_UIAlertControllerActionViewUIAlertActionUIAlertActionViewRepresentation_Internalというプロトコルでチェックアウトします。

+0

'preferredContentSize'をオーバーライドしません。それはプロパティ、それを設定します。 –

+0

@LeoNatanは 'UIViewController'で' readonly'として宣言された 'preferredContentSize'ではありませんか? – JAL

+0

? '@property(nonatomic)CGSize preferredContentSize' –

関連する問題