UITableViewController 应用程序崩溃

Posted

技术标签:

【中文标题】UITableViewController 应用程序崩溃【英文标题】:UITableViewController application crashes 【发布时间】:2013-04-01 02:01:33 【问题描述】:

UITableViewController 在滚动或viewDidAppear: 时冻结。我看到当问题开始时,应用程序开始无法控制地分配对象。 我有ios的以下项目:基本上从CoreData下载信息,但是当我去显示表格中的数据时,应用程序冻结(设备和模拟器)。但是,如果我在下载的NSLog 中显示安排,则没有错误。代码如下:

我看到问题开始时,应用开始不受控制地分配对象。

UITableViewController 在滚动或 viewDidAppear 时冻结:

TableViewController.h

@interface Set_ScheduleViewController : UITableViewController

    STCore *core;
    UILabel *label;
    NSArray *objects;

@end

TableViewController.m:

@implementation Set_ScheduleViewController

- (id)initWithStyle:(UITableViewStyle)style

    self = [super initWithStyle:style];
    if (self) 
        // Custom initialization
    
    return self;


- (void)viewDidLoad

    core = [[STCore alloc] init];
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;
 
    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;


- (void)reloadData

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    objects = [core getAllClassesUsingSortDescriptions:@[sort]];
    [[self tableView] reloadData];


- (void)viewDidAppear:(BOOL)animated

    [self reloadData];
    [super viewDidAppear:animated];


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    // Return the number of rows in the section.
    return [objects count];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 120, 20)];
        label.textColor = [UIColor colorWithHex:0x88B6DB];
        label.font = [UIFont systemFontOfSize:12.0f];
        label.backgroundColor = [UIColor clearColor];
        label.textAlignment = UITextAlignmentRight;
        label.minimumFontSize = 12.0f;
        
        tableView.separatorColor = [UIColor colorWithHex:0xDAE1E6];
        
        cell.textLabel.backgroundColor = [UIColor clearColor];
        cell.textLabel.textColor = [UIColor colorWithHex:0x393B40];
        cell.textLabel.font = [UIFont boldSystemFontOfSize:16.0f];
        
        cell.detailTextLabel.backgroundColor = [UIColor clearColor];
        cell.detailTextLabel.textColor = [UIColor colorWithHex:0x393B40];
        cell.detailTextLabel.font = [UIFont systemFontOfSize:12.0f];
    
    
    cell.textLabel.text = [[objects objectAtIndex:indexPath.row] name];
    cell.detailTextLabel.text = [[objects objectAtIndex:indexPath.row] location];
    
    STMultipleDate *dates = [STMultipleDate new];
    for (Schedule *sch in [[objects objectAtIndex:indexPath.row] schedule]) 
        STDate *date = [STDate new];
        [date setWeekday:[[sch day] integerValue]];
        [date setHour:[[sch hour] integerValue]];
        [date setMinutes:[[sch minutes] integerValue]];
        
        [dates addDate:date];
    
    
    label.text = [STCore splitDates:dates];
    cell.accessoryView = label;
    return cell;



- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section

    if ([objects count] < 1) 
        return NSLocalizedString(@"SETSCH_FOOTER_DEFAULT_404", @"");
    
    return nil;

STCore.m

- (NSArray *)getAllClassesUsingSortDescriptions:(NSArray *)descs

    if (![self isReady]) 
        return @[];
    
    
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Classes" inManagedObjectContext:_context];
    
    [fetchRequest setEntity:entity];
    [fetchRequest setSortDescriptors:descs];
    
    NSError *error;
    NSArray *returned = [_context executeFetchRequest:fetchRequest error:&error];
    
    if (error) 
        [_delegate core:self didRecivedAnError:error];
    
    
    return returned;

【问题讨论】:

有点 OT:但是如果您阅读了文档,您应该检查error != nil,而是检查returned == nil-executeFetchRequest:error:承诺任何error 的价值,除非returned == nil 【参考方案1】:

在您的viewDidLoad 中,您使用[[core context] lock]; 锁定上下文,这导致您的getAllClassesUsingSortDescriptions 等待锁定清除。取下锁。

【讨论】:

我按照你说的做了,还是不行,在 Instruments 中看到,我看到问题开始时,应用程序开始无法控制地分配对象。谢谢回答

以上是关于UITableViewController 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

NSLayoutContraints 在 UITableViewController 上应用不一致(显然)

将 UITableViewController 添加为 splitView 应用程序的详细视图所需的步骤

iPhone x 上的 UITableViewController 顶栏

UITableViewController 的单元格内容消失

在一个 UIViewController 中托管不同的 UITableViewController,例如具有多个视图的日历应用程序

将 UIViewController 更改为 UITableViewController