目前开发的项目中,遇到了一个棘手的问题。最近深入研究学习了一下tabbarController的用法。这样深入了解了ios程序设计的原理,在ios程序的开发过程中,很多ios程序下面都有tabbarController用来显示不同的功能模块。当用户点击每个项的时候,会调用tabBarController的代理方法
- (void)tabBarController:(UITabBarController *)barController didSelectViewController:(UIViewController *)viewController。来处理点击的过程。
其中一个模块涉及到了登陆的内容,Login这个类,但是登陆之后跳转到了accountCenter用户中心的类中,点击下面的tabbar就会又回到了Login这个类。因为tabBar加载的根类中,就有Login。因此是不能够改变的。这就需要在设计上,代码控制tabBar的加载。在Login成功后,还需要用Notification的方式发送通知,AppDelegate获得通知后,通过代码控制tabBar的再次加载。
下面粘贴出关键的代码:
新建Notification类,
#ifndef HnAir_NotificationForLogInAndOut_h
#define HnAir_NotificationForLogInAndOut_h
#define KLoginDoneNotification @"LogInDone_Notification"
#define KLogOutNotification @"LogOutDone_Notification"
#endif
在这里注册了两个通知,一个是登陆成功,另外一个是注销成功
在AppDelegate中,建立通知的两个监听方法:
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(loginDoneNotification:) name:KLoginDoneNotification object:NULL];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(logOutNotification:) name:KLogOutNotification object:NULL];
在获取到监听内容后,调用的方法:
-(void)loginDoneNotification:(NSNotification *)notification
{
logInAndOutCount = 1;
NSArray *cons = [tabBarController viewControllers];
NSMutableArray *newControllers = [[NSMutableArray alloc]init];
[newControllers addObject:[cons objectAtIndex:0]];
[newControllers addObject:[cons objectAtIndex:1]];
[newControllers addObject:[cons objectAtIndex:2]];
[newControllers addObject:account_Controller];
[newControllers addObject:[cons objectAtIndex:4]];
[tabBarController setViewControllers:newControllers];
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:3];
}
-(void)logOutNotification:(NSNotification *)notification
{
logInAndOutCount = 0;
NSArray *cons = [tabBarController viewControllers];
NSMutableArray *newControllers = [[NSMutableArray alloc]init];
[newControllers addObject:[cons objectAtIndex:0]];
[newControllers addObject:[cons objectAtIndex:1]];
[newControllers addObject:[cons objectAtIndex:2]];
[newControllers addObject:logIn_Controller];
[newControllers addObject:[cons objectAtIndex:4]];
[tabBarController setViewControllers:newControllers];
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:3];
}
当用户点击下面的tabbar的时候,代理方法中加入的代码:
int num = [tabBarController.viewControllers indexOfObject:viewController];
NSLog(@"num:%d",num);
if (logInAndOutCount == 0) {
if (num == 3) {
NSLog(@"用户没有登陆");
NSArray *cons = [tabBarController viewControllers];
NSMutableArray *newControllers = [[NSMutableArray alloc]init];
[newControllers addObject:[cons objectAtIndex:0]];
[newControllers addObject:[cons objectAtIndex:1]];
[newControllers addObject:[cons objectAtIndex:2]];
[newControllers addObject:logIn_Controller];
[newControllers addObject:[cons objectAtIndex:4]];
[tabBarController setViewControllers:newControllers];
}
}
else {
if (num==3) {
NSLog(@"用户已经成功登陆");
NSArray *cons = [tabBarController viewControllers];
NSMutableArray *newControllers = [[NSMutableArray alloc]init];
[newControllers addObject:[cons objectAtIndex:0]];
[newControllers addObject:[cons objectAtIndex:1]];
[newControllers addObject:[cons objectAtIndex:2]];
[newControllers addObject:account_Controller];
[newControllers addObject:[cons objectAtIndex:4]];
[tabBarController setViewControllers:newControllers];
}
}
以上代码主要的意义是:当点击下面的tabbar ,情况下,根据当前是否是登陆状态下,去切换tabar加载的根UINavigationController。
在Login类中,加入方法
-(void)postNotification
{
[[NSNotificationCenter defaultCenter]postNotificationName:KLoginDoneNotification object:NULL];
}
当用户登陆成功后,调用[self postNotification];发送登陆信息,到监听方法进行捕获处理。同理,注销的方法也是一样的发送注销信息
这样就能够保证,下面的tabbar进行切换的过程中,不出现bug。由于项目设计到保密的内容,因此只能够技术性的介绍到这里。
自从 IBM 退出 PC 市场之后,在消费市场上很少听到它的消息,移动互联网领域更是难觅它的身影。不过,随着语音助手的趋势到来,IBM 可能会以新的姿态回归。
IBM 和移动设备如何扯上关系?简单的来说:Watson。
去年十月,苹果公司发布了语音助手 Siri,开始智能手机交互方式上的新变革。虽然 Siri 存在重重不足,但毫无疑问的是,这将是智能设备发展最重要的趋势。随后,Google 发布 Google Now(以及新版的 Voice Search), 在追赶 Siri 的同时也进行了创新。但是,在去年二月的时候,IBM 的超级计算机 Watson 就已经以一种戏剧化的方式展示了人工智能上的实力。
现在IBM公司正努力寻求途径改变这一切,欲将超级计算机Watson打造成超级语音助手。IBM公司创新副总裁伯尼·梅尔森(Bernie Meyerson)称,他总是想象能够通过声音启动Waston,并且Waston能够回答基于本地数据、历史趋势和科学研究提出的问题。
2011 年 2 月 14 日至 16 日,在美国的智力问答节目 Jeopardy! 中,Watson 战胜了两位冠军选手 Ken Jennings 和 Brad Rutter,得到 100 万美元的奖金(后捐给慈善机构)。 Watson 的命名取自 IBM 的第一任总裁 Thoms J. Watson,它是 IBM DeepQA 计划的产物,其目的是构建能够与人类进行自然语音交互的计算机系统。在官方网站对 DeepQA 的介绍中,提到了《星际迷航》中的电脑。这同样也是 Google 的野心,在提到知识图谱的时候,Google 的搜索副总裁 Amit Singhal 说自己也是星际迷航的粉丝,而 Google 正在接近这个梦想。
在接受彭博社采访时,梅尔森表示:“有一天,你将能随时进入一个配备世界知识库的难以置信的机器。”尽管目前版本的Waston消耗过多能量在移动设备上,IBM公司正致力于开发Waston 2.0,它将节省能源消耗,使超级计算机拥有更多的“感觉”。IBM 想要把 Watson 推向企业领域,希望在 2015 年的时候将业务分析收入增加到 160 亿美元。Watson 现在掌握的数据包括 Citigroup 方面的财务信息,以及 WellPoint 的癌症数据。新版的 Watson 2.0 将会是低能耗的,可以运行在手机或者平板之上。IBM 的创新副总裁 Bernie Meyerson 对 Watson 的设想是 Siri 的超级版本,比如当一个农夫站在田间,问“我应该何时种玉米”的时候,会很快得到答案。答案将基于地理位置数据、历史趋势和科学研究。
IBM 希望将 Watson 运用在财务、健康、电信等多个领域。要做到这一点,IBM 面临的挑战是如何是 Watson 成为一个移动产品,如何定价和营销。现在,Watson 由 10 排 IBM Power750 服务器驱动,相当于 6000 个桌面电脑的运算能力。如果将 Watson 运行在移动领域,需要考虑能耗问题,而现在它还不够节能。虽然多数的计算发生在数据中心里,Watson 手机应用仍然会消耗太多能量。另外, Watson 还需要加入语音和图像识别能力,以应付现实世界的要求。
和苹果的 Siri 不同的是,Watson 想要解决更加复杂的问题,比如在诊断和用药上给医生提出建议,这意味着它需要了解医学知识,比如肿瘤学。为了提升 Watson 在各专业领域的分析能力,IBM 已经决定以 13 亿美元收购 Kenexa 公司,一个“将技术、服务、科学及信息化产品完美地结合在一起的人力资源外包供应商”。
关于 IBM 是否会关注消费市场,彭博社并没有提及。不过,从 Watson 努力的方向看,应该是专注于特定领域的专业问题,这和日常生活的需求不太相同。不过,从 IBM 副总裁列举的例子来看,专业和日常的界限并非那么明确,比如种植玉米的问题,可以说是专业领域问题,但也与个人的日常生活密切相关。另外,医学和健康问题同样如此。况且,Watson 掌握大量历史和文化方向的知识,应该能在教育领域派上用场。
或许,我们很快就能使用 Watson 提供的服务。做为一个助手的话,Watson 听起来是一个不错的名字。
对此,IBM产业开发副总裁凯瑟琳·福瑞斯(Katharine Frase)称:“对于Waston 2.0,我们希望赋予它更多的感觉。”
1. u can ctrl+left click XXX in codelite, normally it will show u the definition file of xxx, then u may find out which file the implementation is in, for example the same or similiar name as the header file.
2. search content xxx in the errored file. Sometimes the implementation file is in the same place as the errored file.
3. google "undefined reference to XXX" or just xxx, u may find some useful infomation there.