2014年11月24日星期一

Add the "iCloud" entitlement to your App ID

照著指示,在 developer.apple.com 把 iCloud 打勾,也重 新產生並下載 provision profile, 卡了一個小時還是無解,最後我是把 app id 刪除,browser 裡顯示,上架中的 app 不能刪 APP ID,所以刪掉 profile, 而且使用不一樣的名稱,然後進 xcode 裡把 provision profile 都換掉,再 turn off iCloud (如下圖所示),再 Turn on, 試了一次還是紅色,真的很怪,再把 xcode quit, 重新執行,再試幾次後,居然自己就好了。


就是在那切換 team (在 General tab) 和切換 iCloud switch 的 status, 然後他的紅色error 就自己消失了。 @_@;




App Extension project template not appearing in Xcode 6

之所以 App Extension tab 沒出來的原因, 詳細在這裡:
https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionCreation.html#//apple_ref/doc/uid/TP40014214-CH5-SW1




原來是英文太差,是按 Add Target, 不是 Add File...



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只是會越難維護而已

Facebook 留言