一句話筆記续搀,某段時(shí)間內(nèi)遇到或看到的某個(gè)可記錄的點(diǎn)许赃。 2017-10-18
- iOS 連續(xù)多次 Present 之后跟压,回到最初的viewController
- iOS 連續(xù)兩次 Present 時(shí)出現(xiàn)的問(wèn)題
- iOS 中 GET 請(qǐng)求中,某些特殊字符的處理
一塞茅、 iOS 連續(xù)多次 Present 之后亩码,回到最初的ViewController
- 1、當(dāng)然是一個(gè)個(gè) DismissViewController 啦
通過(guò)代理或者 Block 去返回上一級(jí)的 VC野瘦,從而達(dá)到效果描沟。
- 2飒泻、或者說(shuō)利用 presentingViewController 屬性來(lái)完成的。
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
當(dāng)然這個(gè)是可以優(yōu)化下的
UIViewController *viewController = self;
while (viewController.presentingViewController) {
viewController = viewController.presentingViewController;
}
[viewController dismissViewControllerAnimated:YES completion:nil];
注意對(duì) 下面兩個(gè)屬性理解下:
// The view controller that was presented by this view controller or its nearest ancestor.
@property(nullable, nonatomic,readonly) UIViewController *presentedViewController NS_AVAILABLE_IOS(5_0);
// The view controller that presented this view controller (or its farthest ancestor.)
@property(nullable, nonatomic,readonly) UIViewController *presentingViewController NS_AVAILABLE_IOS(5_0);
舉例:
[firstVC presentViewController:secondVC animated:NO completion:nil];
firstVC
的 presentedViewController 就是secondVC
.
secondVC
的 presentingViewController 就是firstVC
.
所以常規(guī)下吏廉,我們用方法二就可以啦泞遗,但是我們卻是用的是 方法一,因?yàn)槲覀兊?PresentVC 都是通過(guò) initWithRootViewController 的方式席覆,所以方法二不符合史辙。
二、 iOS 連續(xù)兩次 Present 時(shí)出現(xiàn)的視圖BUG
上面是我們一個(gè) UIAlertController , 出現(xiàn)這個(gè)原因是佩伤,在一個(gè) VC 中連續(xù) Present 兩個(gè)VC聊倔。
[self presentViewController:alertVC animated:NO completion:nil];
[self presentViewController:testVC animated:NO completion:nil];
在 dismiss testVC
之后就變成這個(gè)樣子啦,所以就是連續(xù)的生巡,當(dāng)然這種情況不是故意的耙蔑,是某種情況下特殊觸發(fā)的。
所以解決這個(gè)問(wèn)題的方法障斋,可以直接在這個(gè)觸發(fā)出做出判斷或者重寫(xiě) presentViewController 這個(gè)方法
if (self.presentingViewController) {
return;
}
哈哈纵潦,還是用 presentingViewController 屬性。
三垃环、 iOS 中 GET 請(qǐng)求中邀层,某些特殊字符(?!@#$^&%*+,:;='"`<>()[]{}/\| )的轉(zhuǎn)義處理。
在 GET 請(qǐng)求中遂庄,我們對(duì)某些特殊字符是需要轉(zhuǎn)義處理的寥院,否則就識(shí)別不出來(lái)啦。
- CFURLCreateStringByAddingPercentEscapes 方法涛目,非法字符是 :
@"?!@#$^&%*+,:;='\”<>()[]{}/\| "
urlStr = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
kCFAllocatorDefault,
(CFStringRef) urlStr,
nil,
CFSTR("?!@#$^&%*+,:;='\"`<>()[]{}/\\| "),
kCFStringEncodingUTF8)
);
- stringByAddingPercentEncodingWithAllowedCharacters
NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString: @"?!@#$^&%*+,:;='\"`<>()[]{}/\\| "] invertedSet];
NSString *encodedUrl = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];
PS : stringByAddingPercentEscapesUsingEncoding 已經(jīng)在 iOS9.0 被拋棄了
[urlstr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];