讀取不了資源
[NSBundle mainBundle]其獲取的路徑是你程序的安裝路徑下的資源文件位置。 在xcode中采用add file to 方式添加文件時你画,一般情況下xcode會自動將文件添加到你的資源文件钥弯,而且皆刺,這些文件在你工程的 build Phases中的 copy Bundle Resources中可以查看到壶运。但是有時候,由于xcode的問題厂抽,采用add files to 不能自動添加到你的資源文件中需频,這時,可以采用copy Bundle Resources下面的“+”號筷凤,手動將文件添加到你的資源文件中
xcode 代碼一拉就直接到最底部,,而看不了中間的代碼,,無法查看..解決方法將xcode 窗口最右側(cè)全部收起..代碼在一排顯示,…沒有換行就行.
tabbar? 自定義item 圖片 會跟你使用的圖片的效果不一樣, 這是因為它是默認以填充形式展現(xiàn),,要加后面的mode 才能展現(xiàn)所有顯示
childVC.tabBarItem.image = [[UIImage imageNamed:image] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
childVC.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
寫的block crash問題?
?對象還未創(chuàng)建 set了block,寫代碼時候不會警告,運行時候就崩潰
方法名與屬性名重名.導致block crash
UINavigationController 彈出新的UIViewController時,setNavigationBarHidden失效的問題
-(void) hideNavBar {
if (self.navigationController.navigationBar.hidden == NO){
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
}
程序多數(shù)坑還是自己挖的
內(nèi)支付 .二進制文件被拒之后,,相應的內(nèi)購項目被退回,,應該及時修改,使其成為預審狀態(tài),,這樣接著提審的時候,蘋果比較看中的內(nèi)購項目,使用沙盒測試就不會出現(xiàn)崩潰情況,,(不是預審狀態(tài)獲取不下來內(nèi)購的價格和名稱)
盡可能的在備注里面說清楚項目所包含的一個業(yè)務情況和邏輯,,以減少審核人員的疑問,,不至于因為疑問被拒絕,
兩個imageview 動畫同步執(zhí)行也只能加一個began …會一起跑,…不然會導致整個app 后續(xù)操作都帶動畫
[UIView beginAnimations:@"gift_plane"context:nil];
//[UIView beginAnimations:imgUrlStr context:nil];
微信支付總結(jié) .
現(xiàn)象 . 吊起微信支付后.整個界面只出現(xiàn) 確定 按鈕..其他區(qū)域全白
微信支付.分為客戶端和后臺統(tǒng)一下訂單兩種…重點注意參數(shù)sign..移動端下訂單,所有簽名和加密都在移動端進行.在delegate 在onrepose里面用通知 對支付結(jié)果進行傳遞到對應地方 …后臺下頂端,,只有prepayid 有用,,sign 要看下是否已經(jīng)簽名過再傳過來的,,如果后臺沒有簽名就穿過來了,,要自己再次簽名.不然吊起微信后只有一個確定按鈕
直播流流播放器ijikplaer 跟環(huán)信的開發(fā)包帶實時視屏的那個包沖圖,,關(guān)于網(wǎng)絡(luò)應該,,導致播放器無法連接到服務器.無法連接解析服務器.只要你環(huán)信的參與編譯了
// 添加點擊手勢使view取消編輯狀態(tài).添加
//注意添加手勢的時機..是要在剛剛創(chuàng)建完該控件的時候立刻添加…?
- (void)addTapGestureCancleEditing{
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTap:)];
tap.delegate = self;
tap.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tap];
[_topHalfBackView addGestureRecognizer:tap];
[_bottomHalfBackView addGestureRecognizer:tap];
}
- (void)viewTap:(UITapGestureRecognizer *)gesture{
[self.view endEditing:YES];
[_accountTextfield resignFirstResponder];
[_inputMoneyTextfield resignFirstResponder];
}
app icon換圖片的時候然后提交(在svn 環(huán)境下),說圖片計劃提交但是misssing得問題
app icon removeItem 一個,拖一個進去,,svn 就不會有問題? 避免沖突
提交svn 不要將pods 文件也提交了..后面會無限沖突..每次都編譯生成新的.project,,與svn 不一致,,就會打不開
collection view 下拉刷新時候崩潰的問題…原因是,,拉的時候會走cell for row..如果此時數(shù)據(jù)沒有下來 而將舊的數(shù)據(jù)全部清楚了..cell for row 就會出現(xiàn)越界問題,,導致崩潰,,,應該等數(shù)據(jù)下來,,再清除舊數(shù)據(jù),,,再添加新數(shù)據(jù),并reload
sdwebimge? 默認進行了圖片本地和內(nèi)存同時緩存..option 可以SDWebImageRefreshCached...這樣就可以讓輪播圖 獲取最新的鏈接圖片? url 為key ..所以跟普通的不同.. 建議每次上傳新的輪播圖圖片都以日期命名..改變url
self.view 的addsubview 和inserch subview 的區(qū)別
[self.view insertSubview:_preplayBackImgView belowSubview:_tableView];插入到某個控件下面.,,,避免被蓋住
一個vc被加在多層view上面,,最底層是一個初始vc ..如何在點擊加了很多層之后的某一個view,用最下面那個vc去push 或者present 一個新的控制器需要用到遍歷響應者,,找到最近一個vc
- (UIViewController *)viewController{
for (UIView* next = self.view.superview; next; next = next.superview){
UIResponder *nextResponder = [next nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]]){
return (UIViewController*)nextResponder;
}
}
return nil;
}
主線程卡頓..第一反應應該去考慮列表加載和刷新時候里面的圖片的獲取方式..
reload tableview 卡線程..排除return height 時候的復雜計算耗時..定位到cell 里面的圖片 加載到富文本時候的網(wǎng)絡(luò)請求? 延時...urlwithcontentof url
.? 需異步加載..直接加載就會有問題...
所有卡線程的問題,,首先考慮在加載有圖片的地方是否異步加載,,,而不是 直接 ? imageData with url
同樣.. 該顯示的ui 經(jīng)常延時很久才出現(xiàn)要排查是否放在了異步子線程里面去了
float 類型 從后臺獲取時候也要使用float value? 不然不足1的時候會轉(zhuǎn)化成0;
lable 的長度不夠..文字大了..有可能出現(xiàn)文字半截字的bug ..改變寬度即可
mjRefresh 的頭部下拉刷新后會插入導航欄…跟collec 的分頁有關(guān),,去掉分頁即可,collectionView.page.enable = no
動畫過程中,鍵盤彈起..單獨監(jiān)聽鍵盤的彈起改變正在動畫的view 的frame 無效,,,需要給這個正在動畫的view 加一個父view ..鍵盤彈起時候改變他的父view 的位置即可,為了用戶體驗,一個復雜的vc,一般開始時就給self.view 添加一個跟self.view一樣大小的contentview.后面各個局部的小view再添加到這個contentview 上面..就會很容易同時對很多個局部view 進行一些操作(比如鍵盤彈起,全部上移,整體添加手勢滑動等)
collectionViewcell 重復的問題.. 不足一頁,,,會有重復的 要補齊..
跳到蘋果評分頁面
NSString* appStoreReviewLink = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=%@&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8",@"1091154038"];
collection layout后的大小是由 sizeForItemAtIndexPath 代理方法最終決定的
讀取圖片兩個方法的區(qū)別
UIImage *img = [UIImage imageNamed:@"myImage"]; // caching
UIImage *img = [UIImage imageWithContentsOfFile:@"myImage"]; // no caching
如果加載一張很大的圖片昭殉,并且只使用一次,那么就不需要緩存這個圖片嵌施。這種情況imageWithContentsOfFile比較合適——系統(tǒng)不會浪費內(nèi)存來緩存圖片饲化。
然而,如果在程序中經(jīng)常需要重用的圖片吗伤,那么最好是選擇imageNamed方法。這種方法可以節(jié)省出每次都從磁盤加載圖片的時間硫眨。
長按手勢的問題
//會調(diào)用2次,開始時和結(jié)束時
- (void)hello:(UILongPressGestureRecognizer *)longPress
{
if (longPress.state == UIGestureRecognizerStateEnded)//需要添加一個判斷
{
NSLog(@"long");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"hello"
message:@"Long Press"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alert show];
}
}
橫豎屏問題 ..將項目info里面設(shè)置為僅支持豎屏,,然后在代碼里面delegate里面處理橫豎屏的問題可行..若info里面支持橫豎屏..橫屏啟動會不走delefgate 里面的方法,,ui 會錯亂
//這句話是防止手動先把設(shè)備置為橫屏,導致下面的語句失效.就是沒有鎖定屏幕分享的時候橫屏開播的情況
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationPortrait] forKey:@"orientation"];
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];
字體下沉.lable ui出現(xiàn)錯亂的問題
_livingTitelNameLable = [MyControl createLabelFrame:CGRectMake(_livingTitelHeadButton.maxX +15, 5, SCREENW/2, _livingTitelBackVIew.height/2-10) Text:self.name? TextColor:[UIColor blackColor] TextAlignment:NSTextAlignmentLeft fontName:setCustomfont font:16.0];
//如果不限制為1行..當字過長.會出現(xiàn)字體下沉.lable ui出現(xiàn)錯亂的問題
_livingTitelNameLable.numberOfLines? = 1;
//清除設(shè)備緩存 ..比command shift + k 有效? .編譯可以..鏈接找不到文件的時候
xcode => window => project => derived data => delete
后臺推音頻需要打開 capabilities - background modes ===modes? 勾選
// [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
先推流,馬上播放一段流..不會有問題..但是 過一段時間 再播放一段視頻流..會導致沒有聲音
使用delegate的時候要注意制定delegate的時機 要在創(chuàng)建的時候
_IsLivingView = [[CBIsLivingView alloc]initWithFrame:CGRectMake(0, 180*SCREEN_SCALE,SCREENW,30*SCREEN_SCALE)];
_IsLivingView.delegate = self;
delegate ? weak 放在創(chuàng)建view的地方..不能在viewdidload 那里.
jpush 在debug線下測試時候ok ,app上線之后 代碼里面兩處也已經(jīng)設(shè)置為線上模式..但是上線后卻收不到推送?
原因在后臺 需要同時將apns_production 字段調(diào)整為true
app第一次安裝時候會有很多權(quán)限需要向用戶申請,如果一些單例都放在新特性類的viewdidload 里面.會使得app 卡在啟動頁面,,放到viewdidappear 則不會卡死.但是如果權(quán)限一次申請過多.會有系統(tǒng)的彈框一閃而過 而探后后面的權(quán)限請求.(相當于前面的請求都會出現(xiàn)兩次)的現(xiàn)象..最好的處理方式 是將獲取權(quán)限的請求分散的放到各個功能用到的地方.?
scrollview tableview collectionview ? 里面的cell 頭部錯位 跑偏 上移或者下移 使用下面代碼,但是要注意 目前基本上沒有ios7 用戶..所以要去掉此判斷?
if (IOS7_OR_LATER) {
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.modalPresentationCapturesStatusBarAppearance = NO;
}
上線商店時候被拒..原因使用了alipay 的sdk ?.被蘋果檢測出api ?,移除后重新提交.仍然被拒檢測出,,仔細檢查..之前只是移除了.a 和framework...openssl因為在alipay 的文件夾下面 ,有其他地方需要用到加密等....文件夾的名字依舊為alipay ..猜測是此原因 ,把文件夾改名之后..發(fā)現(xiàn)rsa 等文件里面找不到openssl 的相關(guān)投文件..查詢知道是因為路徑問題..之前seachHeader path 為alipay ..現(xiàn)在沒有alipay 文件..所以找不到..需要設(shè)置一下路徑問新的文件夾下面.. 還有l(wèi)inkbinary ? framework 里面的 libssl.a 去掉
加密解密
對項目所有的接口進行加密.
*? ? ? 1> 加密過程是先加密足淆,再base64編碼
*? ? ? 2> 解密過程是先base64解碼,再解密
NSString *random =[self makeTimeSha];
NSString *preEncryptStr = [NSString stringWithFormat:@"%@",gkey];
NSData *data = [NSData data];
NSData *dd = [data encryptText:gkey key:random];
NSString * encryptStr? = [dd base64EncodedString];
Url = [NSString stringWithFormat:@"%@&rand=%@&value=%@",webUrl,random,encryptStr];
后臺統(tǒng)一定義一個key .用時間生成的隨機值去進行混合加密,然后用base64編碼一下, 后臺解密ok 就返回請求數(shù)據(jù)
濫用繼承關(guān)系
導航欄透明度的設(shè)置.除了跟自定義的導航欄里面的顏色設(shè)置有關(guān)系.如果有繼承關(guān)系的baseVC里面也對導航欄的定義做了處理(方便全局統(tǒng)一處理導航欄定義).也會影響某個類對自己導航欄顏色的設(shè)置..較難以排查
baseVC里面的對導航欄設(shè)置的每一個屬性,,在push .pop 之后都會對自定義的導航欄有影響...bug 較深,,
dataDic = [NSDictionary dictionaryWithObjectsAndKeys:@"2",@"goods_id", ? 標準的字典寫法有時候回無緣無故 崩潰 并且沒有任何提示..賦值后面的key 和value ?改一下.替換 就好了..猜測是中英文格式原因..不得解
malloc: *** error for object 0x178010000: pointer being reallocated was not allocated
指針錯誤. ?首頁數(shù)據(jù)請求較多.不斷的下拉刷新之后 app 發(fā)生崩潰. ?要看內(nèi)存..可能是因為內(nèi)存的暴漲 沒有釋放 ,導致崩潰 ,,排除法 重點檢查 cell 以及cell 里面的控件等創(chuàng)建..是否在不斷的新創(chuàng)建 ?,沒有移除
stringWithContentsOfURL ?獲取某一地址返回的內(nèi)容,始終是nil ??
NSURL?*url?=?[NSURL?URLWithString:@"http://xxxx.xxx.net/xxx/?xxx.html"];return?[[NSString?stringWithContentsOfURL:url?encoding:NSUTF8StringEncoding?error:nil]?objectFromJSONString];
? ? 但是發(fā)現(xiàn)返回值為nil礁阁,但是在網(wǎng)頁中能打開網(wǎng)頁巧号,并沒有錯的,寫到這里都懵逼了 項目有中并沒有報錯
? ? 最后發(fā)現(xiàn)IOS6引入了APP Transport Security(ATS),新特性要求app內(nèi)訪問的網(wǎng)絡(luò)必須使用HTTPS協(xié)議
? ? ? ? ? ? ??但是項目中是HTTP協(xié)議姥闭,使用私有加密方式保證數(shù)據(jù)安全 丹鸿,改成HTTPS協(xié)議傳輸太麻煩了
? ? ? ? ? ? ? 打開項目的?Info.plist中添加NSAppTransportSecurity類型Dictionary。
? ? ? ? ? ? ? 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設(shè)為YES棚品。 ?
?但是有些小伙伴們在info.plist可能找不到NSAppTransportSecurity是因為
1.Xcode7.0中這項設(shè)定的名稱為:NSAppTransportSecurity
2.Xcode7.1之后這項設(shè)定的名稱為:App Transport Security Setting
時間格式問題 ? ? ?? ??
yyyy-MM-dd-HH:mm:ss 才是年月日標準時間 ? 寫成 ?YYYY-MM-dd-HH:mm:ss ?會導致在2017/12/31 給返回 成了2018/12/31 ?因為最后一周的原因 也因為這個造成重大bug ?獲取時間不對導致時間全部錯誤
最近測試發(fā)現(xiàn)在某個頁面的UITextView輸入中文時靠欢,會顯示輸入錯亂,如上圖所示铜跑。語言問題门怪,輸入法等可能因素后,鎖定了問題的所在: ??為了實現(xiàn)字數(shù)限制 和禁止輸入換行符锅纺,我在回調(diào)函數(shù)里寫了如下的坑爹代碼: ?
-(void)textViewDidChange:(UITextView*)textView{
textView.text?= ? [textView.text?stringByReplacingOccurrencesOfString:@"\n"?withString:@""];
NSUIntegerlen =MIN([textView.textlength],140);
? ?textView.text?= [textView.text?substringToIndex:len];
countLabel.text= len>0?[NSStringstringWithFormat:@"還可輸入%d字",140-len]:@"最多50字";
? ??countLabel.textColor?= len<140?[UIColor?colorWithWhite:0.5alpha:1]:[UIColor?redColor];
}
在監(jiān)聽textview的時候和賦值的時候需要注意代碼
項目中有需要用到列表,每行樣式相同,行數(shù)不多,但是又不希望列表重用(在列表上有很多輸入等其他操作,便于取值,重用會出現(xiàn)問題) ? 采用了每一個id 不一樣的方式創(chuàng)建,在需要的地方 需要取出該行的cell 及cell內(nèi)的某些數(shù)據(jù).給cell設(shè)置tag 的時機很重要 ,必須要在創(chuàng)建那一刻去設(shè)置,不然可能會導致有時取不到改tag值的情況.也可將cell存到到一個數(shù)組在判斷位nil 的時候,取數(shù)組的下標 即可將cell 取出
NSString *idstr = [NSString stringWithFormat:@"%ld",(long)indexPath.row];
? ? ZJChunQiangTableViewCell *chunqiangcell = [tableView dequeueReusableCellWithIdentifier:idstr];
? ? if (chunqiangcell == nil) {
? ? ? ? chunqiangcell = [[ZJChunQiangTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:idstr];
//? ? ? ? if(!_cellArr){
//? ? ? ? ? ? _cellArr = [NSMutableArray new];
//? ? ? ? }
//? ? ? ? [_cellArr addObject:chunqiangcell];
? ? ? ? chunqiangcell.tag = (int)indexPath.row+10000;
? ? }