2015-09-19 13:35:45 Leemin_ios 阅读数 2617
  • 练就iOS高手实战班

    iOS课程教学从入门到实战,系统讲解Swift编程,精讲基础语法,详解iOS基础框架,知识点涵盖新潮实用的swift,AppleWatch App开发。 咨询QQ:2528047463 咨询群:462917576 付费学员答疑群:446896569

    59466 人正在学习 去看看 花川学院
考虑到代理方法 :

textFieldDidEndEditing不能监听到textFiled实时的改变,想要实现实时监听 建议注册通知去监听textField的实时改变,直接上代码: 

  copyright www.stuhack.com

  www.stuhack.com

  本文来自学盟网(www.stuhack.com)

  学生黑客联盟 www.stuhack.com

[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(infoAction)name:UITextFieldTextDidChangeNotificationobject:nil]; 

  

  

- (void)infoAction 

NSIndexPath *index = [NSIndexPathindexPathForRow:0inSection:1]; 

OrderConfirmInfoTableViewCell *cell = (OrderConfirmInfoTableViewCell *)[_tableViewcellForRowAtIndexPath:index]; 

_phoneStr = cell.phoneField.text; 

_addrStr = cell.addressField.text; 



infoAction里就可以把监听的textfield的值的改变 实时的赋值给另一个对象。

2016-05-12 11:58:24 CaryG 阅读数 2325
  • 练就iOS高手实战班

    iOS课程教学从入门到实战,系统讲解Swift编程,精讲基础语法,详解iOS基础框架,知识点涵盖新潮实用的swift,AppleWatch App开发。 咨询QQ:2528047463 咨询群:462917576 付费学员答疑群:446896569

    59466 人正在学习 去看看 花川学院

1、首先Tag值是什么?

Tag是用来标记控件(view)的。通过UIView的tag值,它可以帮助你寻找它的子视图。

比如你有一个UIView,这个UIView含有一个Button,而创建Button时用的是临时变量,你没有这个Button的引用,在这种情况下,你如果想访问这个UIView的Button,你就可以给这个Button一个Tag(必须唯一),需要用的时候就可以[UIView viewWithTag:]来取

    UIView * view = [UIView new];
    [self.view addSubview:view];
    view.tag = 1;
    
    UIView * subView = [self.view viewWithTag:1];



2、Tag可以一样吗?在不同的页面之间,不同的Controller之间设置tag相同会有问题吗?

不可以,tag值是标识控件唯一的参数。

但是在不同的Controller之间,可以相同。不同的Controller就说明是不同的对象,调用的时候是 对象.tag ,这样就显示出区别了。

2019-06-25 18:15:27 CC1991_ 阅读数 1320
  • 练就iOS高手实战班

    iOS课程教学从入门到实战,系统讲解Swift编程,精讲基础语法,详解iOS基础框架,知识点涵盖新潮实用的swift,AppleWatch App开发。 咨询QQ:2528047463 咨询群:462917576 付费学员答疑群:446896569

    59466 人正在学习 去看看 花川学院

在iOS开发中传值是一个非常经典的方法,有六种传值方式:属性传值、代理传值、Block传值、方法传值、单例传值、通知传值。本章就来分享一下通过Block完成两个不同界面间的传值操作。

首先再来了解一下Block,简单一点说,Block就是一段匿名的代码块,是具有某种功能的代码块。那么接下来通过实际应用场景,来直观的演示一下用Block传值的操作,具体如下所示。

实例场景是在控制器A里面点击按钮进入到控制器B中,控制器B里面是一个单元格界面,每一个列表对应的三个参数,需要选中其中想要的列表然后返回并传值到控制器A里面,这就是整个使用场景的描述,接下来是具体实现的代码步骤。

1、控制器A.m文件

控制器A里面按钮点击事件的写法如下:

- (void)popoutBtnClick {

//跳转到控制器B

TeaMineBluetoothController *histoyVC = [TeaMineBluetoothController new];

            [self.navigationController pushViewController:histoyVC animated:YES];

            histoyVC.Complate = ^(NSString *temp, NSString *time, NSString *water) {

//Block传的三个参数给控制器A赋值的地方

                _centigradeDegree = [temp floatValue];

                _timeDegree = [time floatValue];

                _waterDegree = [water floatValue];

            };

}

2、控制器B.h文件

控制器B.h文件里面,需要声明Block函数,需要传三个参数值,具体如下所示:

#import "BaseViewController.h"

@interface TeaMineBluetoothController : BaseViewController

@property (nonatomic, copy) void(^Complate)(NSString *temp, NSString *time, NSString *water);

@end

3、控制器B.m文件

控制器B.m文件里面,主要是在单元格的点击事件里面给Block里面的参数赋值,具体步骤如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    if (_selectedIndexPath && _selectedIndexPath.row == indexPath.row) {

        _selectedIndexPath = nil; //点击了已经选中的列表项,取消选中

    }else {

        _selectedIndexPath = indexPath;

        NSDictionary *dic = _dateSource[indexPath.row];

        NSString *tempValue = dic[@"Temp"];

        NSString *timeValue = dic[@"Time"];

        NSString *waterValue = dic[@"Water"];

        NSString *title = NSLocalizedString(@"Title", nil);

        NSString *bluetooth = NSLocalizedString(@"Choose Success!", nil);

        NSString *confirm = NSLocalizedString(@"Confirm", nil);

        UIAlertController *alert = [UIAlertController alertControllerWithTitle:title                                                                     message:bluetooth preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:confirm style:UIAlertActionStyleDefault

                                                             handler:^(UIAlertAction * action) {

                                                                //Block的赋值地方

                                                                 if (_Complate) {

                                                                     _Complate(tempValue, timeValue, waterValue); //直接给Block里面的三个参数赋值

                                                                 }

                                                                 [self.navigationController popViewControllerAnimated:YES];

                                                             }];

        [alert addAction:cancelAction];

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

        [self.tableView reloadData];//数据加载完成之后刷新tableview

    }

}

这就是通过Block进行的一个简单传值操作,记录一下方便以后使用,不喜勿喷,大牛请绕行。

 

以上就是本章全部内容,欢迎关注三掌柜的微信公众号、微博,欢迎关注!

三掌柜的微信公众号:

三掌柜的新浪微博:

 

2016-09-23 00:40:59 wuyulunbi12580 阅读数 603
  • 练就iOS高手实战班

    iOS课程教学从入门到实战,系统讲解Swift编程,精讲基础语法,详解iOS基础框架,知识点涵盖新潮实用的swift,AppleWatch App开发。 咨询QQ:2528047463 咨询群:462917576 付费学员答疑群:446896569

    59466 人正在学习 去看看 花川学院

客户端代码

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
        NSDictionary *dict = @{@"method":@"setAddress",@"username":@"lisi",@"address":@"beijing"};
        [manager POST:USERSERVLET_PATH parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSString *status = [responseObject objectForKey:@"status"];
            if([@"success" isEqualToString:status]){
                NSLog(@"设置Address成功");
                //更新UI
                _addressLabel.text = address;
            }
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"设置Address失败");
        }];

服务器用的是java的servlet

        PrintWriter out = null;
        try {
            out = response.getWriter();
            String address = request.getParameter("address");
            //要想通过此方法取得参数值,客户端要这样设置(默认就是此配置,可以不写)
            //manager.requestSerializer = [AFHTTPRequestSerializer serializer];
            String username = request.getParameter("username");
            UserDao dao = new UserDaoImpl();
            String status = dao.setAddress(username,address);
            Map<String,String> map = new HashMap<String,String>();
            map.put("status", status);
            JSONObject result = JSONObject.fromMap(map);
            out.print(result.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            out.flush();
            out.close();
        }   
2015-10-05 21:23:10 YuHuiXia 阅读数 285
  • 练就iOS高手实战班

    iOS课程教学从入门到实战,系统讲解Swift编程,精讲基础语法,详解iOS基础框架,知识点涵盖新潮实用的swift,AppleWatch App开发。 咨询QQ:2528047463 咨询群:462917576 付费学员答疑群:446896569

    59466 人正在学习 去看看 花川学院

ios(学习)界面传值的方法

block:

实现界面传值的方法1.block:

实现界面传值,都是从第二个界面向第一个界面传值:第一种block

首先).在第二个界面secondViewController声明set方法

声明block

@property (nonatomic,copy) void(^change)(UIColor *color);

其次).在.m文件实现

实现block的方法

_callback([UIColor redColor]);//注意这里之所以是_callback的原因是实现的get方法,默认的_callback

最后)通过第二个视图控制器带回给firstViewController

实现block里写的方法传给firstViewController

[sv setCallback:^(UIColor *color) {

self.view.backgroundColor = color;

}];

通知中心:

实现界面传值的方法2.通知中心:

首先).注册观察者,然后跳转到第二个界面,在第二个界面进行广播,实现注册时的方法,改变第一个页面的颜色

通过通知中心的方法首先注册一个观察者在firstViewController

1.注册

在通知中心里注册一个观察者self

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notification ) name:@”changeColor” object:nil];

2.其次在secondViewController进行广播

广播

[[NSNotificationCenter defaultCenter]postNotificationName:@”changeColor” object:nil];

3.找到之前的颜色

-(void)notification{

self.view.backgroundColor = [UIColor blueColor];

}

代理

实现界面传值的方法3:代理

首先

从第二个界面向第一个界面传值,我们使用的代理。第二个界面为被代理者,首先要制定协议

协议的本质就是一个方法列表

@protocol Protocal

-(void)changeBackColor:(UIColor *)color;

@end

在协议里面写一个方法,给遵从协议者的奖励

然后告诉说明只要符合以下就可以实现代理

@property (nonatomic,assign) id delegate;

在.m文件中实现方法,用来给予遵从协议的一方

其次:

遵守者,遵守代理协议的一方首先要遵从协议

然后便会获得协议制订者给予的奖励

-(void)changeBackColor:(UIColor *)color

{

self.view.backgroundColor = color;

}

4.该方法是通过获得上一个视图控制器,然后改变其中的内容后传给上一个视图控制器,此处用到了数组,因为视图控制器在多页面跳转时是以棧的形式然后存取是按照数组存取的,方法的实现在secondViewController

NSArray *arr = self.navigationController.viewControllers;

UIViewController *s = [arr objectAtIndex:0];

s.view.backgroundColor = [UIColor redColor];

[self.navigationController popViewControllerAnimated:YES];

5.单例传值单例传值—-从前往后或者从后往前
单例传值
1.定义单例类, 提供创建单例对象的+号方法 命名规范:以main shared standard defalut开头
2.在单例类中定义属性, 存储要传递的数据(属性类型和传输数据类型一致)
3.在进入下一界面之前, 将数据让单例对象存储

4.在其他界面中 直接从单例对象中获取数据即可

单例:保证一个类只能有一个对象
新建单例类 添加创建对象的+号方法, 内部保证无盖该方法调用多少次. 对象只创建一个.
单例优势:(1)节省空间(只能创建一个对象)
(2)共享内存单元
弊端: 单例的空间在整个应用程序运行期间空间都不会回收. 会存在内存泄露问题, 他存在的意义在于解决特定的问题

.h
@interface Singleton : NSObject
//提供创建单例对象的便利构造器方法, 命名规范:以main shared standard defalut开头
+ (Singleton *)mainSignleton;
//存储输入框中的数据
@property (nonatomic, copy) NSString * data;
@end

.m
+ (Singleton *)mainSignleton
{
//加同步锁:
@synchronized (self){
//静态变量
//初始化一次
static Singleton * singleton = nil;
if (singleton == nil) {
singleton = [[Singleton alloc] init] ;
}
return singleton;
}
}

没有更多推荐了,返回首页