學(xué)習(xí)連接:http://www.cocoachina.com/ios/20150824/13104.html
問(wèn)題:
推送:根據(jù)服務(wù)端推送過(guò)來(lái)的數(shù)據(jù)規(guī)則胡控,跳轉(zhuǎn)到對(duì)應(yīng)的控制器
feeds列表:不同的cell陶缺,可能跳轉(zhuǎn)不同的控制器
利用runtime動(dòng)態(tài)生成對(duì)象弦追、屬性、方法這特性湘捎,與服務(wù)端制定好規(guī)則近哟,再用kvc給對(duì)象復(fù)制
HSFeedsViewController.h:
進(jìn)入該界面需要傳的屬性:
@interface HSFeedsViewController : UIViewController
// 注:根據(jù)下面的兩個(gè)屬性,可以從服務(wù)器獲取對(duì)應(yīng)的頻道列表數(shù)據(jù)
/** 頻道ID */
@property (nonatomic, copy) NSString *ID;
/** 頻道type */
@property (nonatomic, copy) NSString *type;
@end
AppDelegate.m:
推送過(guò)來(lái)的消息規(guī)則:
NSDictionary *userInfo = @{
@"class": @"HSFeedsViewController",
@"property": @{
@"ID": @"123",
@"type": @"12"
}
};
接受推送消息:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
[self push:userInfo];
}
跳轉(zhuǎn)界面
- (void)push:(NSDictionary *)params
{
// 類名
NSString *class =[NSString stringWithFormat:@"%@", params[@"class"]];
const char *className = [class cStringUsingEncoding:NSASCIIStringEncoding];
// 從一個(gè)字串返回一個(gè)類
Class newClass = objc_getClass(className);
if (!newClass)
{
// 創(chuàng)建一個(gè)類
Class superClass = [NSObject class];
newClass = objc_allocateClassPair(superClass, className, 0);
// 注冊(cè)你創(chuàng)建的這個(gè)類
objc_registerClassPair(newClass);
}
// 創(chuàng)建對(duì)象
id instance = [[newClass alloc] init];
// 對(duì)該對(duì)象賦值屬性
NSDictionary * propertys = params[@"property"];
[propertys enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
// 檢測(cè)這個(gè)對(duì)象是否存在該屬性
if ([self checkIsExistPropertyWithInstance:instance verifyPropertyName:key]) {
// 利用kvc賦值
[instance setValue:obj forKey:key];
}
}];
// 獲取導(dǎo)航控制器
UITabBarController *tabVC = (UITabBarController *)self.window.rootViewController;
UINavigationController *pushClassStance = (UINavigationController *)tabVC.viewControllers[tabVC.selectedIndex];
// 跳轉(zhuǎn)到對(duì)應(yīng)的控制器
[pushClassStance pushViewController:instance animated:YES];
}
檢測(cè)對(duì)象是否存在該屬性