zoukankan      html  css  js  c++  java
  • UIActionViewController 详解 iOS8

    iOS8推出了几个新的“controller”,主要是把类似之前的UIAlertView变成了UIAlertController,这不经意的改变,貌似把我之前理解的“controller”一下子推翻了~但是也无所谓,有新东西不怕,学会使用了就行。接下来会探讨一下这些个新的Controller。
    复制代码
    - (void)showOkayCancelAlert {
        NSString *title = NSLocalizedString(@"A Short Title Is Best", nil);
        NSString *message = NSLocalizedString(@"A message should be a short, complete sentence.", nil);
        NSString *cancelButtonTitle = NSLocalizedString(@"Cancel", nil);
        NSString *otherButtonTitle = NSLocalizedString(@"OK", nil);
    
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
        
        // Create the actions.
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:cancelButtonTitle style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
            NSLog(@"The "Okay/Cancel" alert's cancel action occured.");
        }];
        
        UIAlertAction *otherAction = [UIAlertAction actionWithTitle:otherButtonTitle style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
            NSLog(@"The "Okay/Cancel" alert's other action occured.");
        }];
        
        // Add the actions.
        [alertController addAction:cancelAction];
        [alertController addAction:otherAction];
        
        [self presentViewController:alertController animated:YES completion:nil];
    }
    复制代码

    这是最普通的一个alertcontroller,一个取消按钮,一个确定按钮。

    新的alertcontroller,其初始化方法也不一样了,按钮响应方法绑定使用了block方式,有利有弊。需要注意的是不要因为block导致了引用循环,记得使用__weak,尤其是使用到self。

    上面的界面如下:

    如果UIAlertAction *otherAction这种otherAction多几个的话,它会自动排列成如下:

    另外,很多时候,我们需要在alertcontroller中添加一个输入框,例如输入密码:

    这时候可以添加如下代码:

     [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
            // 可以在这里对textfield进行定制,例如改变背景色
            textField.backgroundColor = [UIColor orangeColor];
        }];

    而改变背景色会这样:

    完整的密码输入:

    复制代码
    - (void)showSecureTextEntryAlert {
        NSString *title = NSLocalizedString(@"A Short Title Is Best", nil);
        NSString *message = NSLocalizedString(@"A message should be a short, complete sentence.", nil);
        NSString *cancelButtonTitle = NSLocalizedString(@"Cancel", nil);
        NSString *otherButtonTitle = NSLocalizedString(@"OK", nil);
    
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
        
        // Add the text field for the secure text entry.
        [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
            // Listen for changes to the text field's text so that we can toggle the current
            // action's enabled property based on whether the user has entered a sufficiently
            // secure entry.
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTextFieldTextDidChangeNotification:) name:UITextFieldTextDidChangeNotification object:textField];
    
            textField.secureTextEntry = YES;
        }];
    
        // Create the actions.
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:cancelButtonTitle style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
            NSLog(@"The "Secure Text Entry" alert's cancel action occured.");
    
            // Stop listening for text changed notifications.
            [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:alertController.textFields.firstObject];
        }];
    
        UIAlertAction *otherAction = [UIAlertAction actionWithTitle:otherButtonTitle style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
            NSLog(@"The "Secure Text Entry" alert's other action occured.");
    
            // Stop listening for text changed notifications.
            [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:alertController.textFields.firstObject];
        }];
        
        // The text field initially has no text in the text field, so we'll disable it.
        otherAction.enabled = NO;
    
        // Hold onto the secure text alert action to toggle the enabled/disabled state when the text changed.
        self.secureTextAlertAction = otherAction;
    
        // Add the actions.
        [alertController addAction:cancelAction];
        [alertController addAction:otherAction];
        
        [self presentViewController:alertController animated:YES completion:nil];
    }
    复制代码

    注意四点:

    1.添加通知,监听textfield内容的改变:

    复制代码
    // Add the text field for the secure text entry.
        [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
            // Listen for changes to the text field's text so that we can toggle the current
            // action's enabled property based on whether the user has entered a sufficiently
            // secure entry.
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTextFieldTextDidChangeNotification:) name:UITextFieldTextDidChangeNotification object:textField];
    
            textField.secureTextEntry = YES;
        }];
    复制代码

    2.初始化时候,禁用“ok”按钮:

    otherAction.enabled = NO;

    self.secureTextAlertAction = otherAction;//定义一个全局变量来存储

    3.当输入超过5个字符时候,使self.secureTextAlertAction = YES:

    - (void)handleTextFieldTextDidChangeNotification:(NSNotification *)notification {
        UITextField *textField = notification.object;
    
        // Enforce a minimum length of >= 5 characters for secure text alerts.
        self.secureTextAlertAction.enabled = textField.text.length >= 5;
    }

    4.在“OK”action中去掉通知:

    复制代码
    UIAlertAction *otherAction = [UIAlertAction actionWithTitle:otherButtonTitle style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
            NSLog(@"The "Secure Text Entry" alert's other action occured.");
    
            // Stop listening for text changed notifications.
            [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:alertController.textFields.firstObject];
        }];
    复制代码

    最后是以前经常是alertview与actionsheet结合使用,这里同样也有:

    复制代码
    - (void)showOkayCancelActionSheet {
        NSString *cancelButtonTitle = NSLocalizedString(@"Cancel", nil);
        NSString *destructiveButtonTitle = NSLocalizedString(@"OK", nil);
        
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
        
        // Create the actions.
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:cancelButtonTitle style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
            NSLog(@"The "Okay/Cancel" alert action sheet's cancel action occured.");
        }];
        
        UIAlertAction *destructiveAction = [UIAlertAction actionWithTitle:destructiveButtonTitle style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
            NSLog(@"The "Okay/Cancel" alert action sheet's destructive action occured.");
        }];
        
        // Add the actions.
        [alertController addAction:cancelAction];
        [alertController addAction:destructiveAction];
        
        [self presentViewController:alertController animated:YES completion:nil];
    }
    复制代码

    在底部显示如下:

    好了,至此,基本就知道这个新的controller到底是怎样使用了。

  • 相关阅读:
    使用内部单向链表实现的一个简单堆栈
    通过反射调用内部类的隐藏方法
    动态代理生成空对象
    通过使用java.lang.reflect.Proxy实现动态代理
    简单代理模式
    暗色CSS,适用与Stylish, IE, FF, OPERA等.
    CWnd派生的控件处理MouseMove, MouseHover, MouseLeave
    _tcscpy_s的size应至少为src的长度+1(要把计算在内)
    用INET(CHttpFile)下载有重定向链接时获取最终URL的方法.
    GetDlgItem以及其他获得CWnd相关的函数要注意。。
  • 原文地址:https://www.cnblogs.com/guangleijia/p/4758078.html
Copyright © 2011-2022 走看看