2013-10-08 29 views
3

根據this question和KyleC的回答,我實現了一個UITableViewController,其中有許多行依賴於Core Data的提取。每行顯示一個簡單的NSString(提取的對象的名稱)並隱藏一個UIPickerViewiOS 7使用UIPickerView很慢地打開UITableViewController

問題是,當我點擊前一個UITableViewController中打開帶選取器視圖的UITableViewController中的行時,segue轉換會有一些延遲。

我知道這是因爲之前的控制器(他們甚至執行核心數據請求)在轉換中並不那麼慢。

-

一些UIPickerView S能夠使過渡如此緩慢和好看不好看? 我應該在哪種模式下使用工具來了解哪些是慢罪?

更重要的是:如果緩慢來自UIPickerView的數字,我該如何優化?

我想澄清一下,該應用程序非常輕,從Core Data獲取的對象只有4個,其中有4個UIPickerView

+1

這是相關的:http://blog.ittybittyapps.com/blog/2013/09/20/lifting-the-lid-on-ios-7s-uipicker/ –

回答

9

似乎UIPickerViews和UIDatePickers從故事板(可能是xib的,但我沒有嘗試)加載得非常緩慢。在iPad Air上,大約需要3秒鐘的時間才能在「隱藏」單元中加載包含4個UIPickerViews和8個UIDatePickers的靜態UITableViewController。 (3秒對於運行在最新和最好的硬件上的原生UI是永恆的!)

我發現的解決方法是在隱藏行顯示之前以編程方式創建UIPickerViews和UIDatePickers。我所做的是創建在Interface Builder空單元格,鏈接這些細胞IBOutlet中的屬性,然後創建DatePickers和選擇器視圖使用這些方法:

- (UIDatePicker*)datePickerForCell:(UITableViewCell*)cell { 
    UIDatePicker * datePicker = [[UIDatePicker alloc] initWithFrame:cell.bounds]; 
    [datePicker setDatePickerMode:UIDatePickerModeDateAndTime]; 
    [datePicker addTarget:self action:@selector(pickerDateChanged:) forControlEvents:UIControlEventValueChanged]; 
    datePicker.hidden = YES; 
    [cell addSubview:datePicker]; 

    return datePicker; 
} 

- (UIPickerView*)pickerViewForCell:(UITableViewCell*)cell { 
    UIPickerView * picker = [[UIPickerView alloc] initWithFrame:cell.bounds]; 
    [picker setDelegate:self]; 
    [picker setDataSource:self]; 
    picker.hidden = YES; 
    [cell addSubview:picker]; 
    return picker; 
} 

本作的UITableViewController加載時間降低到幾十分之一一秒鐘,它似乎並不影響顯示隱藏的桌面視圖的動畫。

注意:我嘗試在viewDidAppear:方法中創建採樣器,但它似乎仍然延遲了UI。

+0

大答案,許多開發者不注意到這種滯後,但它讓我有些緊張,並且花了我更多的時間來縮小到日期選擇器的範圍。 – EmilDo

+0

我使用通過storyboard添加的日期選擇器來獲取靜態單元的uitableview的加載時間非常慢。我簡單地從故事板中刪除了我的數據添加器,添加了兩個函數,例如datePickerForCell函數和兩行從viewwillappear調用它們的函數,所有操作都快得多。沒有沒有日期選擇器的速度,可能是1/3秒,而不是3秒,所以這很好。歡呼 – LpLrich

+0

我簡直不敢相信這是正確的答案,但我採取了一些表明它確實是正確的測量。在XIB中使用日期選擇器將我們的加載時間增加了1.589秒,同時通過編程將其僅增加了1.007秒。當然,這仍然是一個完全無法接受的時間,但很高興知道。它看起來像延遲加載/重用實例是一種方式。 –