2016-01-04 17 views
12

Ich möchte eine UIAlertViewController wie diese umzusetzen (Referenz: Pages und Keynote-App):Wie kann UIAlertController mit UITableView angepasst werden oder gibt es ein Standard-Steuerelement wie dieses UI in der Pages App?

enter image description here.

Ich habe eine benutzerdefinierte Tabellenansicht implementiert und präsentierte die Ansicht durch Nachahmen der UIAlertViewController. Aber ich kann keine ähnliche Benutzeroberfläche wie oben erreichen. Gibt es dafür einen Standard-Controller?

-(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

ist sowieso vorhanden, um uitableview von uialertviewcontroller zu pop. – SMS

+0

Sie wollen diese Funktionalität nur durch UITableView erreichen .. – Ricky

+0

Siehe meine Antwort. Ich habe das mehrfach implementiert und es ist sehr einfach. –

Antwort

5

UIAlertController verfügt über eine private contentViewController-Eigenschaft, mit der Sie jede UIViewController-Unterklasse als Teil des Alert-Controllers festlegen können. Es funktioniert sowohl mit Action-Sheets als auch mit Alert-Styles. Sie können den Inhaltsansicht-Controller mit anderen Warnaktionen mischen.

Dies ist, wie UIActivityViewController, die Airdrop Vorschau-Controller, etc. implementiert sind.

Best Practice ist UIAlertController Unterklasse und in entweder initWithNibName:bundle: oder viewDidLoad verwenden setValue:forKey: die contentViewController Eigenschaft festzulegen. Vergessen Sie nicht, die preferredContentSize für Ihren Content-View-Controller festzulegen.

+4

"Best Practice ist die Subklasse' UIAlertController' "... uhhh, nein. Aus der Dokumentation: "Die UIAlertController-Klasse ist so zu verwenden, wie sie ist und unterstützt keine Unterklassen." – Firo

+0

@Firo Wir sprechen hier über private API. Ich kann bestätigen, dass es gut funktioniert. –

+4

Ich zweifle nicht daran, dass es funktioniert. Ich würde es einfach nicht als "Best Practice" bezeichnen. Ich sehe keinen Hinweis auf das OP, das über private APIs spricht, das ist alles. – Firo

0

Ich glaube, Sie UIAlertController mit einem preferredStyle Satz UIAlertControllerStyleActionSheet verwenden soll.

Aber wenn dies von Grund auf neu beginnen ist nicht genug, von UIWindow und UIViewController mit Tableview und jede UI machen Sie wollen, gibt es eine Menge von benutzerdefinierten Alertview-Implementierungen Ich bin sicher, dass Sie leicht ein zum Beispiel gefunden.

+0

UIAlertcontroller, gibt es eine Möglichkeit, es mit Bildern auf der rechten Seite anzupassen, habe ich bereits versucht UIAlertcontroller, konnte aber nicht die gleiche Anforderung erfüllen. Bitte teilen Sie mir einen Beispielcode, wenn es mir helfen kann. – SMS

1

Hinzufügen auf Leos Antwort, ja, es ist ein Privateigentum auf UIAlertControllercontentViewController, die Sie eine UIViewController festlegen kann (und es ist Sicht) als Inhalt der UIAlertController.

Sie können eine private Schnittstelle erstellen, um diese Eigenschaft zuzugreifen, ohne KVO zu verwenden oder einen eigenen Header importieren wie folgt:

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

Dann Layout Ihrer benutzerdefinierten Ansicht in Ihrem Inhalt des View-Controller view über Interface Builder oder programmatisch .

Denken Sie daran, dass Sie auch preferredContentSize Ihre Ansicht Controllers außer Kraft setzen müssen:

- (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); 
} 

Hinweis: anstatt das Überschreiben der Getter, Leo Natan die preferredContentSize direkt schlägt Einstellung, da es eine Eigenschaft auf UIViewController ist.

Sie können auch die view Ihres Ansichtscontrollers in Ihrer Unterklasse ebenfalls überschreiben, wenn Sie möchten.

Ihre Warnung vor als normalerweise einrichten würde:

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" 
                        preferredStyle:UIAlertControllerStyleActionSheet]; 

Stellen Sie Ihre benutzerdefinierte Ansicht:

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

Fügen Sie Ihre Aktionen:

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

Präsens als gewohnt:

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

Weitere Informationen zu den privaten APIs von UIAlertController finden Sie auf dem iPhone Dev Wiki article on UIAlertController.

Ich würde auch die privaten Schnittstellen auf _UIAlertControllerActionView und UIAlertAction, sowie das UIAlertActionViewRepresentation_Internal Protokoll überprüfen.

+0

Überschreiben Sie 'preferredContentSize' nicht. Es ist eine Eigenschaft, setze es. –

+0

@LeoNatan wird '' preferredContentSize' 'nicht als 'readonly' auf' UIViewController' deklariert? – JAL

+0

Huh? '@Eigenschaft (nichtatomisch) CGSize preferredContentSize' –