按照这篇博文,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删除自己"的思路,解决了这个问题。