ViewController之间如何传值

按照这篇博文,ViewController之间传值的方法有十种之多。

我在这段时间用到了三种方法:
以下论述均假定:A控制器传值给B控制器

1.extern

extern方法是最简单的。
在A控制器.m文件@Implementation字头前声明变量,例如NSString *str;
在B控制器.m文件@Implementation字头前声明变量extern NSString *str;
然后就可以在B控制器中直接调用str

2.NSUserDefaults

NSUserDefaults其实和归档类似。就是在A控制器.m文件中归档要传值的参数。

NSData *encodedStr = [NSKeyedArchiver archivedDataWithRootObject:Astr];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:encodedStr forKey:@"str"];

然后在B控制器中解档调用。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *decodedStr = [defaults objectForKey:@"str"];
if (Bstr == nil) {
    Bstr = [[NSString alloc]init];
}
if(encodedStr == nil {
    NSMutableArray *newStr = [[NSString alloc] init];
    Bstr = newStr;
}else{
    Bstr = (NSMutableArray *)[NSKeyedUnarchiver unarchiveObjectWithData:decodedStr];
}

3.设置委托

在A控制器.h文件@Interface字头前设置代理:

@protocol AtoBDelegate <NSObject>
@required
- (NSString *)doWith:(NSString *)parameter;
@end

在A控制器.h文件中设置属性:

@property id<AtoBDelegate> delegate;

并在A控制器.h文件中执行方法:

[self.delegate doWith:(NSString *)parameter];

而在B控制器中引入A的.h文件#import "A.h"并添加代理<AtoBDelegate>,然后在.m文件中指定代理

[(A *)*a setDelegate:self];//(A  *)只是表明类型,实际中不用出现

声明方法

- (NSString *)doWith:(NSString *)parameter{
     self.Btr = [self doWith:(NSString *)str];
}

当(A *)a在B控制器的.m文件中执行doWith:Astr方法时即实现传值。


我在写浏览器代码时并没用代理方法实现控制器之间的传值。而是在UICollectionView与UICollectionViewCell交互时用到这个方法。在UITableView中,官方提供了indexPathForSelectedRow可以返回indexPath,从而删除选定行。但在UICollectionView只有indexPathsForSelectedItems返回数组,无法返回单个indexPath。所以要实现删除选定单元就只能另辟蹊径。

我参考了Stackoverflow答案
http://stackoverflow.com/a/23095967/5243422
遵循 UICollectionViewCell请求UICollectionView删除自己 的思路,解决了这个问题。

posted on 2015-12-01 13:58  Rim99  阅读(395)  评论(0编辑  收藏  举报

导航