我有一個UITableView的問題。我在後臺線程中從數據庫服務器加載數據,如果完成,它會發送通知。在通知中,我更新了我的視圖的數據數組,並在tableview上使用reloadData。 然後tableview取消選擇所選的行(這意味着數據被重新加載),如果我想選擇另一行,我會在didSelectRowAtIndexPath的第一行獲得EXC_BAD_ACCESS,即使它只是一個NSLog。重新加載數據後選擇行崩潰
如果我不分配新數組,後臺線程會將變量數據提供給我並且不使用reloadData我沒有使用didSelectRowAtIndexPath的問題,但tableview不顯示最近的記錄。用戶必須關閉視圖並再次打開以查看更改。這真的很糟糕,我想在後臺線程完成從服務器加載記錄後馬上顯示這些更改。
在.h文件中聲明的變量:
-downloadThread是NSThread,
- 數據是一個NSArray,
-manager是我的SQL接口。
-(void)viewDidLoad
{
...
[super viewDidLoad];
NSMutableArray *arr = [[manager getTeilnehmerList] retain];
data = arr;
[self.tableView reloadData];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KundenUpdated:) name:@"ContactUpdate" object:nil]; // to be notified when updating thread is finished
downloadThread = [[NSThread alloc] initWithTarget:self selector:@selector(teilnehmerLoad:) object:nil]; //Thread to get actual data on Background
[downloadThread performSelector:@selector(start) withObject:nil afterDelay:2];
...
}
-(void)teilnehmerLoad:(id)sender
{
[manager loadTeilnehmerFromServerAndInsertIntoDatabase];
//data = [manager getTeilnehmerList];
[self.tableView reloadData];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ContactUpdate" object:nil];
}
-(void)KundenUpdated:(NSNotification*)notifaction
{
@synchronized(self)
{
//needs function to select row that was selected before reload if the data record is still there after sync with server
[self.tableView reloadData];
NSLog(@"count data in kundenupdated: %i",data.count);
}
}
請在通知方法中發佈代碼? –
那麼你在didSelectRowAtIndexPath的第一行記錄什麼?在cellForRowAtIndexPath中發生了什麼?我懷疑這是你的錯誤所在,可能無法正確回收細胞。 –
請注意,您不應該從後臺調用reloadData(這肯定會導致崩潰),但應該使用peformSelectorOnMainThread或其他方法來使調用在UI線程中執行。 –