2012-10-21 45 views
1

我在我的應用程序,包含根字典行,一個的plist當我用下面的代碼在NSMutableArray添加此行:爲什麼plist中的字符串在UITableView中顯示的順序不正確?

NSString * item = [badgeDict objectForKey:[NSString stringWithFormat:@"item%i",indexPath.row+1]]; 
[badgeArray addObject:item]; 

它給我炒有序陣列... 我想它請注意那些被稱爲(item1,item2,item3 ...等)的行的關鍵字...

它應該如何解決?

+0

此代碼位於何處? – atxe

+0

裏面的tableview cellAtindex –

+0

你也說數組是亂序的,你是否打印出數組的實際內容來驗證? –

回答

1

是的,它會被攪亂,因爲你的代碼是在cellForRowAtIndexPath。

UITableViewCells被緩存。既然你沒有顯示相關的周邊代碼,它很可能是你重新顯示緩存的單元格。

1

考慮到tableView:cellForRowAtIndexPath:在需要新單元格時被調用:首次填充UITableView時,以及在滾動時出現單元格時。因此,在這種方法中填充數據源並不是一個好習慣。

我建議你填寫你的數據在viewDidLoad。如果UITableView需要刷新包含的信息,然後創建一個方法,並從viewDidLoad以及刷新發生的位置調用它(例如按下按鈕,當刷新刷新時,...)。

1

我將你的代碼移動到viewDidLoad方法而不是cellForRowAtIndexPath,可能是因爲你調用reloadRowsAtIndexPaths這樣的方法,如果你的badgeArray是實例變量,這會破壞順序,而且你可能沒有完全填充整個數組,並非所有行都立即顯示在屏幕上。

您的方法似乎並不高效。如果您的badgeDict可能會發生變化,您可以嘗試實施通知。只需將您的UIViewController作爲觀察者添加到badgeDict更改中,並在發生此類事件時重新加載badgeArray。

要做到這一點:

  • 在你的viewController的viewDidLoad補充:

    [NSNotificationCenter defaultCenter]的addObserver:自我選擇:@選擇(refreshBadgeArray :)名:@ 「BadgeChanged」 對象:無]。

  • 在你的viewController的附加的dealloc:

    [NSNotificationCenter defaultCenter] removeObserver:自我]。

  • 到位
  • 其中badgeDict被改變:

    [[NSNotificationCenter defaultCenter] postNotificationName:@ 「BadgeChanged」 對象:自];

2

在的tableView:的cellForRowAtIndexPath:您可以訪問對象以這種方式

NSArray *keys = [[badgeDict allKeys] sortedArrayUsingSelector:@selector(compare:)]; 
id value = [badgeDict objectForKey:[keys objectAtIndex:indexPath.row]]; 

這是很好的,如果你的plist小,否則保存鍵在成員變量訂購。

相關問題