按照這篇博文,ViewController之間傳值的方法有十種之多尖阔。
我在這段時間用到了三種方法:
以下論述均假定:A控制器傳值給B控制器
1.extern
extern方法是最簡單的慌随。
在A控制器.m文件的@Implementation
字頭前聲明變量睁冬,例如NSString *str;
逾冬。
在B控制器.m文件的@Implementation
字頭前聲明變量extern NSString *str;
。
然后就可以在B控制器中直接調用str
饼煞。
2.NSUserDefaults
NSUserDefaults其實和歸檔類似。就是在A控制器.m文件中歸檔要傳值的參數(shù)诗越。
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文件中執(zhí)行方法:
[self.delegate doWith:(NSString *)parameter];
而在B控制器中引入A的.h文件#import "A.h"
并添加代理<AtoBDelegate>
,然后在.m文件中指定代理
[(A *)*a setDelegate:self];//(A *)只是表明類型嚷狞,實際中不用出現(xiàn)
聲明方法
- (NSString *)doWith:(NSString *)parameter{
self.Btr = [self doWith:(NSString *)str];
}
當(A *)a在B控制器的.m文件中執(zhí)行doWith:Astr
方法時即實現(xiàn)傳值块促。
我在寫瀏覽器代碼時并沒用代理方法實現(xiàn)控制器之間的傳值。而是在UICollectionView與UICollectionViewCell交互時用到這個方法床未。在UITableView中竭翠,官方提供了indexPathForSelectedRow
可以返回indexPath,從而刪除選定行薇搁。但在UICollectionView只有indexPathsForSelectedItems
返回數(shù)組斋扰,無法返回單個indexPath。所以要實現(xiàn)刪除選定單元就只能另辟蹊徑。
我參考了Stackoverflow答案
http://stackoverflow.com/a/23095967/5243422
遵循"UICollectionViewCell請求UICollectionView刪除自己"的思路褥实,解決了這個問題呀狼。