【发布时间】:2012-03-15 09:54:46
【问题描述】:
我的UITableViewController 中有一个UITableView(很明显,哈哈),但我需要在- (void)viewWillAppear:(BOOL)animated 方法内的给定索引处获取一个单元格。
现在,我的单元格是静态的,我在界面构建器中创建它们。如果我打电话给
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:previously_selected_cell.integerValue inSection:0]];
它为单元格返回 null。我在 1 个部分中只有 3 个静态单元格。我尝试了第 0 节和第 1 节,都返回 null。
目前我已经删除了- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法,因为如果我添加它,它将清除我所有静态单元格的UITableView。
我可以在- (void)viewWillAppear:(BOOL)animated 中调用一个方法来返回给定索引处的单元格吗?
提前致谢!
编辑:我检查了this stackoverflow question,但我使用的是没有 cellForRowAtIndexPath 的静态单元格,所以这个问题没有帮助。 :(
EDIT2:我正在尝试在视图加载时设置单元格的附件类型。但仅限于某个单元格,该单元格是用户在退出应用之前选择的那个单元格。
#import "AutoSyncSettings.h"
#import "CDFetchController.h"
@implementation AutoSyncSettings
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
CDFetchController *cdfc = [[CDFetchController alloc] init];
NSFetchedResultsController *results = [cdfc getFetchedResultsControllerWithEntityName:@"SETTINGS"];
NSArray *objects = [results fetchedObjects];
NSNumber *sync_setting;
if(objects.count > 0)
{
NSManagedObject *object = [objects objectAtIndex:0];
sync_setting = [object valueForKey:@"wifi_setting"];
NSLog(@"(Settings)sync_setting: %@",sync_setting);
NSLog(@"(Settings)sync_setting int value: %i",sync_setting.integerValue);
NSLog(@"(Settings)TableView: %@",self.tableView);
//cell is null, even after this.
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:wifi_settings.integerValue inSection:0]];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
//cell is still null. WHY OH WHY? :(
objects = nil;
}
cdfc = nil;
results = nil;
objects = nil;
sync_setting = nil;
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return NO;
}
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
return NO;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
for (int i = 0; i < [tableView numberOfRowsInSection:indexPath.section]; i++)
{
if([[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:indexPath.section]] accessoryType] == UITableViewCellAccessoryCheckmark)
{
[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:indexPath.section]].accessoryType = UITableViewCellAccessoryNone;
}
}
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
CDFetchController *cdfc = [[CDFetchController alloc] init];
NSFetchedResultsController *results = [cdfc getFetchedResultsControllerWithEntityName:@"SETTINGS"];
NSManagedObjectContext *context = [results managedObjectContext];
NSArray *objects = [results fetchedObjects];
if(objects.count > 0)
{
NSManagedObject *object = [objects objectAtIndex:0];
NSNumber *sync_setting = [NSNumber numberWithInt:indexPath.row];
[object setValue:sync_setting forKey:@"sync_interval"];
[object setValue:[NSNumber numberWithInt:0] forKey:@"id"];
[ErrorHandler saveMoc:context];
}
else
{
//INSERT NEW OBJECT
NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"SETTINGS" inManagedObjectContext:context];
NSNumber *sync_setting = [NSNumber numberWithInt:indexPath.row];
[object setValue:sync_setting forKey:@"sync_interval"];
[object setValue:[NSNumber numberWithInt:0] forKey:@"id"];
[ErrorHandler saveMoc:context];
}
}
@end
【问题讨论】:
-
我相信
cellForRowAtIndexPath应该仍然有效;你确定previously_selected_cell.integerValue有你期望的值吗? -
@jtbandes 是的,目前是 2 个。如果在 cellForRowAtIndexPath 中添加注释,我所有的静态单元格都会消失。我相信它会尝试创造新的细胞......
-
您到底想实现什么 - 为什么要在 viewWillAppear 方法中获取该索引处的单元格?
-
@NickBull 抱歉,将编辑我的问题。我想为先前选择的单元格添加一个复选标记附件,即使应用程序退出/崩溃,
previously_selected_cell变量也会被存储 -
当您被请求与先前设置的索引路径匹配的索引路径时,为什么不在您的 tableview 委托中的
cellForRowAtIndexPath实现中设置它?
标签: objective-c uitableview delegates interface-builder