zoukankan      html  css  js  c++  java
  • KDotAlert

    一个iPhone X的适配让楼主受尽了自定义的苦,使用系统API多好,所以在楼主不懈的努力下,终于和组长达成一致:逐步用系统控件替换代码里面的自定义控件,第一个挨刀的就是 BlockAlertsAnd-ActionSheets,不是楼主不喜欢它或者它写的不好,而是因为这个好替换,可是啊,楼主维护的App代码量大概在100万行左右,全都写成系统的也会吐啊!,下面先介绍下系统的样子。

    iOS8.0,苹果开放:UIAlertController 并在之后两个版本放弃了对UIAlertView(9.0)和 UIActionSheet(8.3)的维护。

    NS_CLASS_DEPRECATED_IOS(2_0, 9_0, "UIAlertView is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert instead") __TVOS_PROHIBITED
    @interface UIAlertView : UIView
    @end
    
    NS_CLASS_DEPRECATED_IOS(2_0, 8_3, "UIActionSheet is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleActionSheet instead") __TVOS_PROHIBITED
    @interface UIActionSheet : UIView
    @end

    UIAlertController 是UIAlertView &UIActionSheet的合集,通过UIAlertControllerStyle来确定是Alert or ActionSheet

    NS_CLASS_AVAILABLE_IOS(8_0) @interface UIAlertController : UIViewController
    
    + (instancetype)alertControllerWithTitle:(nullable NSString *)title message:(nullable NSString *)message preferredStyle:(UIAlertControllerStyle)preferredStyle;
    
     - (void)addAction:(UIAlertAction *)action;
    @property (nonatomic, readonly) NSArray<UIAlertAction *> *actions;
    
    @property (nonatomic, strong, nullable) UIAlertAction *preferredAction NS_AVAILABLE_IOS(9_0);
    
    - (void)addTextFieldWithConfigurationHandler:(void (^ __nullable)(UITextField *textField))configurationHandler;
    @property (nullable, nonatomic, readonly) NSArray<UITextField *> *textFields;
    
    @property (nullable, nonatomic, copy) NSString *title;
    @property (nullable, nonatomic, copy) NSString *message;
    
    @property (nonatomic, readonly) UIAlertControllerStyle preferredStyle;
    
    @end

    UIAlertController 要求初始化的时候就指明类型(preferredStyle 是 readonly),尽管API设计的相当简单,但是用起来总是有点不太舒服,如下:

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:style];
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { NSLog(@"OK"); }]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { NSLog(@"OK"); }]; [alertController addAction:okAction]; [alertController addAction:cancelAction]; [self /** self isKindof:UIViewController */presentViewController:alertController animated:YES /** must be YES*/ completion:nil];

    楼主想哭,可是自己找的锅,累死也要搞定,所以就着手开始处理,整了3个我就开始觉得不是办法了,想了下,楼主决定动手改造下系统API,楼主不会打自己脸的,所以也不是瞎折腾,也不是自定义,只是改了系统API的调用方式。

    其实还是系统的!!!!
    其实还是系统的!!!!
    其实还是系统的!!!!
    下面上一段代码看看怎么使用!

    [KDotAlert alert].format(@"Cancel", @"There is Cancel")
    .action(@"OK", ^(UIAlertAction * _Nonnull action) {
        [self showMore:@"OK"];
    }).cancel(@"Cancel", nil).show(self, nil);

    至于:[self showMore:@"OK"]; self是安全的,不需要你加weak

    看下定义:

    NS_CLASS_AVAILABLE_IOS(8_0) @interface KDotAlert : NSObject
    
    @property (nonatomic, strong, readonly) KDotAlertFormat format;         // format title & message
    @property (nonatomic, strong, readonly) NSString * _Nullable title;     // title
    @property (nonatomic, strong, readonly) NSString * _Nullable message;   // message
    @property (nonatomic, assign, readonly) UIAlertControllerStyle preferredStyle;  // The style of the alert controller.
    
    @property (nonatomic, strong, readonly) KDotAlertAction action;     // Attaches an action object to the alert or action sheet. default style;
    @property (nonatomic, strong, readonly) KDotAlertAction cancel;     // ... cancel style;
    @property (nonatomic, strong, readonly) KDotAlertAction destructive;// ... destructive style;
    
    // The actions that the user can take in response to the alert or action sheet.
    @property (nonatomic, strong, readonly) NSArray<UIAlertAction *> * _Nullable actions;
    
    // Make the preferred action for the user to take from an alert.
    @property (nonatomic, strong, readonly) KDotAlertPreferred preferred NS_AVAILABLE_IOS(9_0);
    
    
    @property (nonatomic, strong, readonly) KDotAlertTextField  textField;                  // Adds a text field to an alert;
    @property (nonatomic, strong, readonly) NSArray<UITextField *> * _Nullable textFields;  // The array of text fields displayed by the alert.
    
    @property (nonatomic, strong, readonly) KDotAlertShow show; // show with viewController 
    
    + (instancetype _Nonnull )alert;
    + (instancetype _Nonnull )actionSheet;
    
    @end

    基本上支持了所有系统API...
    算了,不吹了,上Github连接;

  • 相关阅读:
    [CodeForces]Codeforces Round #429 (Div. 2) ABC(待补)
    About Me
    2018-06-14
    Codeforces Codeforces Round #484 (Div. 2) E. Billiard
    Codeforces Codeforces Round #484 (Div. 2) D. Shark
    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes
    Codeforces Avito Code Challenge 2018 D. Bookshelves
    Codeforces Round #485 (Div. 2) D. Fair
    Codeforces Round #485 (Div. 2) F. AND Graph
  • 原文地址:https://www.cnblogs.com/kongkaikai/p/7819819.html
Copyright © 2011-2022 走看看