为什么向NSArray添加(通过输入代码)对象会冻结我的应用程序?

时间:2015-10-28 16:27:15

标签: ios objective-c uitableview nsarray

我走到了尽头。我有 UITableViewCell 类,用作"设置"我的申请中的标签。创建单元格并计算如下:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.refreshControl = nil;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.scrollEnabled = NO;

(...)注意标题4被评论

NSArray* titles = @[ @"Title1", @"Title2", @"Title3"/*,@"Title4"*/];

    for (int i = 0; i < titles.count; i++)
    {
        SettingsTableCell* cell = [[SettingsTableCell alloc] initWithFrame: CGRectMake(0, 0, self.tableView.frame.size.width, self.tableView.frame.size.height / titles.count)];
        cell.textLabel.text = [titles objectAtIndex:i];
        cell.textLabel.numberOfLines = -1;
        cell.backgroundColor = i % 2 == 0 ? [Colors colorForType:kLegiaColorWhite] : [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.textLabel.font = [Fonts fontWithSize: IPHONE_IPAD(18.0, 24.0)];
        cell.accessoryView = i == 0 ? calendarSwitch : (i == 1 ? scheduleFilterSwitch : wifiSwitch);

        [cells addObject:cell];
    }
}

我认为下面的一切都是正确的

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [cells count];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return self.tableView.frame.size.height / [self tableView:tableView numberOfRowsInSection:indexPath.section];
}

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [cells objectAtIndex:indexPath.row];
}

请注意,当我取消注释数组中的第四个标题时会出现问题。 当我进入“设置”选项卡时,它开始循环(我在调试器中检查)和应用程序相当冻结而不是崩溃。有三个标题,它就像一个魅力。你能帮我找到原因吗?

编辑:

@Avi建议之后,我在heightForRowAtIndexPath上放置了断点,并在这个特定方法上循环。在调试器中我有这个: StackView

1 个答案:

答案 0 :(得分:0)

在研究和减少*titles数组中的项目(它适用于1和2项)之后,我注意到每个单元都有自己的UISwitch,而第4个没有,因为它不需要。由于此错误,布局子视图无法完成。 所以我更改了以下行:

   cell.accessoryView = i == 0 ? calendarSwitch : (i == 1 ? scheduleFilterSwitch : wifiSwitch);

到那个

cell.accessoryView = i == 0 ? calendarSwitch : (i == 1 ? scheduleFilterSwitch : i == 2 ? wifiSwitch : nil);

我工作了! 帮助你们寻求帮助!