1.編寫程序時,出現崩潰怎么解決?
1> 導出崩潰日志...
(1) 可以在 xcode 的頂部菜單中,找到 Windows-->devices 選項,在彈出的窗口選中左側我的 iPhone,
(2) 點擊右側 view devices logs 按鈕,查看左側列表崩潰列表,並選中當前程序,右鍵 export log,導出.
2> 找到 dysm
(1) XCode編譯產生的app文件和dYSM文件路徑(可以通過快捷鍵 command+,打開,進入頂部的 location,點擊DerivedData后面的按鈕,查找以下路徑)
<current User>/Library/Developer/XCode/DerivedData/<Project name>-<other character>/Build/Products
(2) 直到找到.app 和. dysm 為止.
3> 歸同一個文件夾
將第一步導出的 log 和第二部找到的 app 文件和 dysm 文件放入同一個文件夾
4> cd 進入以上文件夾,執行以下命令:
xcrun atos -o PandaTV-ios.app.dSYM/Contents/Resources/DWARF/PandaTV-ios -arch arm64 -l 0x100090000 0x1008f2de4
(PS:只改變倒數第一/二個參數即可,倒數第二個是基地址,倒數第一個是偏移地址)
5> 確定基地址和偏移地址
崩潰日志中 PandaTV-ios 0x1008f2de4 0x100090000 + 8793572
只需要解析以 app 名稱打頭的崩潰語句,其中0x1008f2de4是偏移地址,0x100090000才是基地址
2.webview 打開時,有加載失敗的提示.
1> Error Domain=WebKitErrorDomain Code=102 "幀框加載已中斷" UserInfo={NSErrorFailingURLStringKey=http://itunes.apple.com/cn/app/..
2> 應該是鏈接有問題,把 http 換成 https 有可能成功.
3> Error Domain=WebKitErrorDomain Code=101 "無法顯示 URL" UserInfo={NSErrorFailingURLStringKey=quddddddeals://home, NSLocalizedDescription=無法顯示 URL, NSErrorFailingURLKey=quddddddeals://home}
4> 應該是 urlscheme 沒有添加quddddddeals,並最好把quddddddeals放入LSApplicationQueriesSchemes白名單中.
3.iOS 8 UIKeyboardWillShowNotification通知可以收到,但是無法執行
1> 在 iOS 9及以上系統在收到UIKeyboardWillShowNotification通知時,能迅速執行UI 操作,但是 iOS 8 系統收到該通知時, UI 操作不生效.
2> 網上查了 iOS 8 相關資料后,都是UIKeyboardWillShowNotification調用兩次的處理方法,和我的目的不一樣.
3> 情急之下,我查了查其余類似的通知,添加了UIKeyboardDidShowNotification方法,竟然能成功,只是會晚點兒執行.
4> 做了最壞的打算,跳躍多層 view, 來監聽這個事件...
5> 絕望時,無意間想到,這是 UI 操作,是不是在子線程無法執行啊???於是就寫進了 dispatch_asyn,還是不起作用
6> 靈機一動,把 dispatch_asyn 改成 dispatch_after 會怎么樣???結果竟然真成功了
7> 看來是時序的問題嘍,延遲0.15秒后執行,就完美了.
4.iOS7 讓有導航控制器中的控件從導航欄下面開始布局(origin.y == 0的位置)
1> 讓控制器的 edgesForExtendedLayout 屬性設置為 UIRectEdgeNone .
2> 讓控制器的導航欄不透明self.navigationController.navigationBar.translucent = NO;
3> 以上兩種方法任選一種,都可以讓控件從導航欄頂部開始布局.
5.自定義的slider
1> 可以繼承 UIControl 的 continueTrackingWithTouch:withEvent:方法,來響應滑動事件...
6.UILable 一半是白的一半是綠的
1> 設置了 attributeText 屬性以后有可能出現這個問題
7.在最外層頁面 push 新界面失敗
1> push 操作一般需要兩個元素,一個是根導航控制器,一個是要跳轉的頁面.后者沒問題的話,只能是前者出了問題.
2> 在彈出UIAlertView框時,[UIApplication sharedApplication].keyWindow 會指向該UIAlertView框.進而導致查找最外層頁面失敗.
3> 解決方案是使用 appdelegate 中的 window, 永遠不會錯.[UIApplication sharedApplication].delegate.window.rootViewController
8.判斷禁用 bounces 的 UIScrollView 對象左滑還是右滑,上滑還是下滑
1> 由於 bounces 禁用,沒有彈性效果,滑到最左邊時, contentOffset.x 最小值為0,因此得考慮其他方法. 開始拖拽+結束拖拽 是個好方法
2> 若 bounces 沒有被禁用,本想只使用 scrollViewDidScroll 一個方法來確定是否是左滑退出的,但是該方法會調用很多次,會影響打點等操作,因此推薦步驟1方法.
1 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 2 { 3 if (scrollView == _scrollView) 4 { 5 // 判斷是否左滑退出 6 _isScrollToRight = YES; 7 } 8 } 9 10 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 11 { 12 if (scrollView == _scrollView) 13 { 14 // 判斷是否左滑退出 15 if (_lastContentOffsetX == 0 && 16 !_isScrollToRight && 17 _lastContentOffsetX >= scrollView.contentOffset.x) 18 { 19 } 20 } 21 } 22 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 23 { 24 if (scrollView == _scrollView) 25 { 26 // 判斷是否左滑退出 27 _lastContentOffsetX = scrollView.contentOffset.x; 28 _isScrollToRight = NO; 29 } 30 }
1 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 2 { 3 CGFloat lastY = _tableViewLastContentOffsetY; 4 // 上滑 5 if (scrollView.contentOffset.y >= lastY) 6 { 7 PTVLog(@"LZ465350---上滑....%f",scrollView.contentOffset.y); 8 9 // 排除用力下拉到頭,又反彈(上彈)到平衡位置的情況 10 if (scrollView.contentOffset.y <= _tableViewFirstContentOffsetY) 11 { 12 } 13 else 14 { 15 [self moveTagView:YES distance:ABS(scrollView.contentOffset.y - lastY)]; 16 } 17 18 } 19 // 下滑 20 else 21 { 22 PTVLog(@"LZ465350---下滑..%@.....%f",scrollView,scrollView.contentOffset.y); 23 24 // 排除用力上拉到頭,又反彈(下彈)到平衡位置的情況 25 if (scrollView.contentOffset.y + scrollView.height >= scrollView.contentSize.height) 26 { 27 } 28 else 29 { 30 [self moveTagView:NO distance:ABS(scrollView.contentOffset.y - lastY)]; 31 32 } 33 34 } 35 _tableViewLastContentOffsetY = scrollView.contentOffset.y; 36 } 37 38 - (void)moveTagView:(BOOL)up distance:(CGFloat)distance 39 { 40 if (up) 41 { 42 if (self.tagView.y > -self.tagView.height) 43 { 44 self.tagView.y -= distance; 45 if (self.tagView.y < -self.tagView.height) 46 { 47 self.tagView.y = -self.tagView.height; 48 } 49 } 50 } 51 else 52 { 53 if (self.tagView.y < 0) 54 { 55 self.tagView.y += distance; 56 if (self.tagView.y > 0) 57 { 58 self.tagView.y = 0; 59 } 60 } 61 } 62 }
9.點擊屏幕 UITableView 以外的區域, 列表變灰
1> 設置了 UITableView 對象的 allowsSelection 屬性可能不生效,而且無法使用 tableview 的 didselect 代理方法.
2> 還需要把 UITableViewCell 對象的 selectionStyle 屬性設置為UITableViewCellSelectionStyleNone,才能生效.
10.查找沒有顯示的 cell
1> UICollectionViewCell *hotCell = [self cellForItemAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0]];
是沒有用的.
2> 可以遍歷 UICollectionView 的子視圖,其子視圖就是其 cell.
3> UITableView 就沒有這么好說話了,子視圖不是其 cell, 要想找到沒有顯示的 cell, 只能通過先修改數據源,再刷新某一個 item 的數據來實現.