2014年11月6日星期四

Correct way to asynchronously load tableview cell data

在處理 iOS8 的 detailTextLabel.text 無法顯示時, 以為是自己的寫法有問題, 所以先 google 了一下如何非同步更新 tableview 裡的 cell, 在 iOS8 之前都是 bind 一個 label, 然後在 async 的 function 裡去 update label value 就做完了, 實際上也可以 work. 網路上推薦的做法是把 indexPath 傳進去 async function 裡, 透過  indexPath 再取出 cell 來 update value.

function 都改寫好了, 還是無法 work, 再去 google 才發現是 ios 8 UITableViewCell detail text not correctly updating 的 bug.



dispatch_async(dispatch_get_main_queue(), ^{
    [_tableViewDescirptions setValue:shortBody forKey:cellHash];
    if ([[tableView indexPathForCell:cell] isEqual:indexPath]) {
        UILabel *descriptionLabel = (UILabel *)[cell viewWithTag:104];
        [descriptionLabel setText:[_tableViewDescirptions valueForKey:cellHash]];
    }
});

or

 // 1. Create a method for asynch. downloading tableview cell data:

    - (void) loadMessageDescription:(CTCoreMessage *)message forIndexPath:(NSIndexPath *)indexPath
    {
        dispatch_async(backgroundQueue, ^{

            BOOL isHTML;
            NSString *shortBody = [message bodyPreferringPlainText:&isHTML];
            shortBody = [shortBody substringToIndex: MIN(100, [shortBody length])];

            dispatch_async(dispatch_get_main_queue(), ^{

                UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

                [_messagesDescriptions setValue:shortBody forKey:[NSString stringWithFormat:@"%d",message.hash]];
                [(UILabel *)[cell viewWithTag:104] setText:shortBody];
                //[cell setNeedsLayout];
            });
        });
    }

//2. check for the tableview scrolling when get a tableview cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{

...

if (_tableView.dragging == NO && _tableView.decelerating == NO){

            [self loadMessageDescription:message forIndexPath:indexPath];
        }

...

// 3. When the scroll stopped - load only visible cells

- (void)loadMessageDescriptionForOnscreenRows
{
    NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows];
    for (NSIndexPath *indexPath in visiblePaths)
    {
        CTCoreMessage *message = [_searchResults objectAtIndex:indexPath.row];

        if([_messagesDescriptions valueForKey:[NSString stringWithFormat:@"%d",message.hash]] == nil){
            {
                [self loadMessageDescription:message forIndexPath:indexPath];
            }
        }
    }
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (!decelerate){

        [self loadMessageDescriptionForOnscreenRows];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [self loadMessageDescriptionForOnscreenRows];
}

from:

Correct way to asynchronously load tableview cell data
http://stackoverflow.com/questions/18160166/correct-way-to-asynchronously-load-tableview-cell-data

ios 8 UITableViewCell detail text not correctly updating

原因是當 detailTextLabel default value 是 null 時, 無法第1次 set value 就進去 text 裡.


解法很多, 我是在 storyboard 裡 assign 空格 " " 進 default value 裡就解決了, 相關的解法還有:

1:
 adding [self.tableView reloadData] to viewDidAppear:

2:
- (void) viewDidAppear:(BOOL)animated
{
  [super viewDidAppear:animated];
  [self.without setNeedsLayout];
}

3:
... 算了, 這個神人弄的太複雜... @_@;



資料來源:



2014年10月16日星期四

“Redundant Binary Upload” Issue on iTunesConnect

如果遇到已經上傳了一個版本的 binary 到 itunesconnect, 相同版本會無法上傳, 解法也很簡單, 修改掉 build 的版號, 並在 xcode 裡重新 archive 一次後, 重新 Validate... 再 Distribute... 一次即可.

如果你進一個新版本都是有管理的話, 建議先上 itunesconnect, 增加一個版號後, 再到 xcode 裡重新 archive 一次後, 重新 Validate... 再 Distribute... 一次即可.


2014年10月12日星期日

iOS console log configuration utility iTools

今天才知道 iTools 這麼神奇, 居然可以看到我在程式碼裡寫的 console log, 真是太方便了, 不用進 xcode 也可以 debug..., 缺點是其他App 的 log 也一直在輸出.




檔案下載:

http://www.itools.cn/

Hokila Jan的iOS考題整理

在網路上亂晃, 發現一個厲害的人, Hokila Jan 分享 iOS 徵人時的題目, 似乎滿實用的, 我應該先來找答案, 以後去別家公司面試時, 也許就可以派上用場.

資料來源: 

http://josihokila.blogspot.tw/2013/12/ios.html


  • 1.什麼是MVC、MVC的好處?
  • 2.什麼是delegate?舉例?
  • 3.什麼是KVO?寫個範例
  • 4.實作callback的時候怎麼決定要用block還是delegate
  • 5.thread之間要怎麼溝通?NSOperationQueue跟GCD的差別是?
  • 6.objc裡面可不可以用try catch?為什麼不常看到?
  • 7.請問HIG裡面說一個button最小的大小是多少?
  • 8.在iOS6跟iOS7分別要怎麼樣客製化UIAlertView
  • 9.MapView裡面要怎樣customized pin,有哪幾種作法? 除了原生mapKit還用過哪些圖資?
  • 10.請實作singleton 
  • 11.請實作一個factory 物件
  • 12.請寫出view lifecycle
  • 13. arc的壞處?
  • 14.演算法題:都差不多,寫個小function或者給function要寫出output。
    14.1 給一串string吐回inverse
    14.2 把河內塔用push pop代替recursive寫一遍。
    14.3 或者ACM抄來的。

下面這幾題跟objC無關,但是寫iOS一定要知道,筆試不會考,都是我在面試時被問或問對方的:


  • 1.有一天推播突然不能用了,有哪幾種可能?
  • 2.要怎麼看 dsym
  • 3.xib要怎麼和storyboard混用
  • 4.storyboard上要怎麼用用客製化的view,xib上要怎麼用用客製化的view。
  • 5.什麼是hash什麼是加密?各舉兩個例子。


相關文章:

開始作乾濕分離
http://josihokila.blogspot.tw/2014/01/blog-post.html
不管是web、iOS、Android還是Windows,基本功一定是刻UI,就iOS來說,在創建一個UI的時候,有三種方式:用code寫、xib或storyboard。storyboard在頁面很少功能不多的時候是神兵利器,但是隨著案子慢慢變大,就會發現越來越多的功能需要用xib或code才做得到,再繼續用storyboard只是會越難維護而已

2014年9月22日星期一

Privacy Policy

送審的 App 被 Apple 退件了, 原因是 17.5: Apps that include account registration or access a user’s existing account must include a privacy policy or they will be rejected.
url: https://developer.apple.com/app-store/review/guidelines/#privacy



解法1: 來產生一組隱私權宣告:

http://www.freeprivacypolicy.com/free-privacy-policy-generator.php

按了一堆 "Next" 發現還真麻煩.


解法2: copy from 類似產品的宣告.

ex: https://www.dropbox.com/privacy


2014年9月17日星期三

iOS VLC https live streaming - TLS client session handshake error

google 了半天,居然都沒有遇到相同的問題,真怪,難道大家VLC的版本都超級舊,或是都沒有去存取 TLS 憑存不合法的網站資料?結論是,問題居然找到原因而且出在官方的bug. @_@;

要解這個bug, 首先你要能夠build VLC ios 的 code.


下圖我遇到的問題,Error message: Your input can't be opened, VLC is unable to open the MRL ...


[175d1fc4] core tls session error: TLS client session handshake error
[175d19b4] http access error: cannot establish HTTP/TLS session
[175cead4] core input error: open of `https://yourname.com.tw/v1/streaming/607ab61f-0b00-418e-87ec-f76fcea684ec?token=b93da454bb0f40a6bc69b95f2c6d8786' failed


網路上的人說: 0.9.0以上版本的VLC都不支持TLS證書合法性驗證的開關。
0.9.0之後的版本,VLC去掉了--no-tls-check-tls命令


before 0.9.0 舊的解法:
=======================
    [MyOptionsArray addObject:@"--no-tls-check-cert"];

    [MyOptionsArray addObject:@"--no-tls-check-hostname"];


new error message, after 0.9.0:
=======================
vlc: unknown option or missing mandatory argument `--xxxx'
Try `vlc --help' for more information.



神人同事Lyle.Wang 在 trace 了 VLC source code 後,發現是 VLC 的 bug, 他們寫錯。

ios ▸ ImportedSources ▸ VLCKit ▸ MobileVLCKit ▸ ImportedSources ▸ vlc ▸ securetransport.c

把上面的 answer == 2 修改為  answer==1 後功能就正常了。還有在 run /buildMobileVLCKit.sh -n
這裡請加上一個 -n, 如果不加的話,每次build code 都會重新把 vlc clone 下來,git server 上的 code 是錯的。



目前VLC 官方用的 2014-09-15 的版本還是有問題:
http://nightlies.videolan.org/build/ios/MobileVLCKit-UniversalBinary-20140915-0616.zip

Facebook 留言