由于項(xiàng)目中經(jīng)常遇到這些坑苛白,所以在這里做一下匯總位谋,方便以后遇到是查閱多柑,順便也分享給大家论衍,共同進(jìn)步瑞佩。
1. ?修改導(dǎo)航欄
1.1 ?修改導(dǎo)航欄的背景圖和文字
UIImage *backgroundImage;
UIImage *shadowImage;
UIColor *titleColor;
backgroundImage = [[UIImage imageNamed:@"NavBar_bg"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch];
shadowImage = [UIImage imageWithColor:[UIColor clearColor] size:CGSizeMake(self.navigationController.navigationBar.size.width, 0.5)];
titleColor = [UIColor colorWithHex:0xffffff];
[self.navigationController.navigationBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setShadowImage:shadowImage]; [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : titleColor, NSFontAttributeName : [UIFont fontWithName:@"Helvetica-Bold" size:17]}];
1.2 ?修改導(dǎo)航欄為透明
//設(shè)置導(dǎo)航欄背景圖片為一個(gè)空的image
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
//去掉透明后導(dǎo)航欄下邊的黑邊
[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];
//這句是關(guān)鍵,如果只是個(gè)別頁面需要透明坯台,則需要在父類中設(shè)置為NO炬丸,然后在需要透明的頁面設(shè)置為YES
self.navigationController.navigationBar.translucent = YES;
2. ?獲取view所在的VC
在開發(fā)中我們經(jīng)常遇到很多自定義的view以及列表的cell中有需要點(diǎn)擊跳轉(zhuǎn)到其他頁面的情況,我們一般的處理是使用block或者delegate在實(shí)現(xiàn)這種跳轉(zhuǎn)蜒蕾,但是這樣的寫法耦合太高稠炬,而且寫起來也麻煩,所以我在這里提供了一個(gè)類方法來實(shí)現(xiàn)這個(gè)需求滥搭。
+ (UIViewController *)getCurrentVC {
UIViewController *result = nil;
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
//app默認(rèn)windowLevel是UIWindowLevelNormal酸纲,如果不是,找到UIWindowLevelNormal的
if (window.windowLevel != UIWindowLevelNormal) ?{
NSArray *windows = [[UIApplication sharedApplication] windows];
for (UIWindow * tmpWin in windows) ?{
if (tmpWin.windowLevel == UIWindowLevelNormal) ?{
window = tmpWin;
break;
}
}
}
id nextResponder = nil;
UIViewController *appRootVC = window.rootViewController;
// 如果是present上來的appRootVC.presentedViewController 不為nil
if (appRootVC.presentedViewController) ?{
nextResponder = appRootVC.presentedViewController;
} ?else ?{
// NSLog(@"===%@",[window subviews]);
UIView *frontView = [[window subviews] objectAtIndex:0];
nextResponder = [frontView nextResponder];
} ?
if ([nextResponder isKindOfClass:[UITabBarController class]]) ?{
UITabBarController * tabbar = (UITabBarController *)nextResponder; UINavigationController * nav = (UINavigationController *)tabbar.viewControllers[tabbar.selectedIndex];
// UINavigationController * nav = tabbar.selectedViewController ; 上下兩種寫法都行 result=nav.childViewControllers.lastObject;
} ?else if ?([nextResponder isKindOfClass:[UINavigationController class]]) ?{ UIViewController * nav = (UIViewController *)nextResponder;
result = nav.childViewControllers.lastObject;
} ?else if ?([nextResponder isKindOfClass:[UINavigationController class]]) ?{
result = nextResponder;
} ?else ?{
result = [UIViewController new];
}
return result;
}
這個(gè)類方法需要寫在所有viewcontroller的父類中瑟匆,然后再需要使用的地方調(diào)用闽坡。
使用方法:
CPBaseViewController *Curr = (CPBaseViewController *)[CPBaseViewController getCurrentVC];
CPLoginViewController *vc = [[CPLoginViewController alloc] init]; CPNavigationViewController *nav = [[CPNavigationViewController alloc] initWithRootViewController:vc];
[Curr.navigationController presentViewController:nav animated:YES completion:nil];
3. ?VC之間的傳值
我們一般在遇到需要將上一頁的參數(shù)傳遞到下一頁的時(shí)候,通常使用的辦法是愁溜,在下一頁VC的.h中聲明一個(gè)變量疾嗅,然后再push或present的時(shí)候點(diǎn)出該屬性然后附上值。這種寫法就把這個(gè)VC的屬性暴露在了外面冕象,也增加了耦合代承。解決辦法是,在所有VC父類中添加一個(gè)方法渐扮,用來傳遞參數(shù)论悴。
@property (nonatomic, copy, readonly) NSMutableDictionary *parameter;
/** 給下一個(gè)頁面?zhèn)鲄ⅲ簡(jiǎn)蜗騻鬟f掖棉,下一頁面可直接通過self.parameter獲取參數(shù)。 @param param?param
*/
- (void)setResult:(NSDictionary *)param;
- (void)setResult:(NSDictionary *)param ?{
if (!param) return;
_parameter ?= ?[param mutableCopy];
}
使用方法:
UIViewController *vc = [[UIViewController alloc] init];
[vc setResult:@{}];
[self.navigationController pushViewController:vc animated:YES];
未完待續(xù)膀估。幔亥。。