Как мне создать переменную внутри оператора switch для UITableView? - PullRequest
2 голосов
/ 04 февраля 2011

enter image description here

Я создаю tableView, который состоит из трех разделов. У меня первые два работают, но последний немного устойчив. Кажется, моя проблема заключается в попытке объявить переменную внутри оператора switch, фактически вложенного оператора switch. Из того, что я прочитал, это не очень хорошая идея, но в данном случае это кажется единственным вариантом.

В данном разделе динамически учитывается количество объектов Alert, связанных с определенным элементом оборудования. Оповещения поступают из Базовых данных, и вместо «Дата» и «Оповещение» я хочу отобразить информацию из Оповещения. Я получаю соответствующие предупреждения, используя NSFetchRequest. Это возвращает массив объектов Alert, отсортированных так, как я хочу. Чтобы отобразить правильную информацию в cellForRowAtIndexPath, я пытался вернуть это правильное предупреждение для строки, используя

Alert *alert = [allAlerts objectAtIndex:indexPath.row];

Кажется, мне не разрешено объявлять переменную внутри оператора switch. Любые идеи, как я могу обойти это? Мне нужно будет сделать нечто подобное в didSelectRowForIndexPath, потому что мне нужно выдвинуть подробное представление, когда ячейка выбрана.

Я пытался объявить переменную вне оператора switch, но это не сработает, потому что index.row может запросить объект с индексом, которого нет в массиве Alert, и который вылетает из программы.

Данный код находится внизу этого метода:

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

//Cell Identifiers
static NSString *attributeCellIdentifier = @"attributeCellIdentifier";
static NSString *operatingInfoCellIdentifier = @"operatingInfoCellIdentifier";
static NSString *alertCellIdentifier = @"alertCellIdentifier";

//Create Attribute Cell If Required
UITableViewCell *attributeCell = [tableView dequeueReusableCellWithIdentifier:attributeCellIdentifier];
if (attributeCell == nil) {
    attributeCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:attributeCellIdentifier] autorelease];
    attributeCell.selectionStyle = UITableViewCellSelectionStyleNone;
}

//Create Operating Info Cell If Required
UITableViewCell *operatingInfoCell = [tableView dequeueReusableCellWithIdentifier:operatingInfoCellIdentifier];
if (operatingInfoCell == nil) {
    operatingInfoCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:operatingInfoCellIdentifier] autorelease];
    operatingInfoCell.selectionStyle = UITableViewCellSelectionStyleNone;
}

//Create Alert Cell

UITableViewCell *alertCell = [tableView dequeueReusableCellWithIdentifier:alertCellIdentifier];
if (alertCell == nil) {
    alertCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:alertCellIdentifier] autorelease];
    alertCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}


switch (indexPath.section) {
    //Attribute Section
    case 0:
        switch (indexPath.row) {
            case kEquipmentAttributeSectionNameRow:
                attributeCell.textLabel.text = @"Name";
                attributeCell.textLabel.textAlignment = UITextAlignmentRight;
                attributeCell.selectionStyle = UITableViewCellSelectionStyleNone;
                [attributeCell.contentView addSubview: self.nameField];
                break;
            case kEquipmentAttributeSectionLocationRow:
                attributeCell.textLabel.text = @"Location";
                attributeCell.textLabel.textAlignment = UITextAlignmentRight;
                attributeCell.selectionStyle = UITableViewCellSelectionStyleNone;
                [attributeCell.contentView addSubview: self.locationField];
                break;
            case kEquipmentAttributeSectionControllerSNRow:
                attributeCell.textLabel.text = @"Serial #";
                attributeCell.textLabel.textAlignment = UITextAlignmentRight;
                attributeCell.selectionStyle = UITableViewCellSelectionStyleNone;
                [attributeCell.contentView addSubview: self.controllerSNField];
                break;
            case kEquipmentAttributeSectionEquipTypeRow:
                attributeCell.textLabel.text = @"EquipType";
                attributeCell.textLabel.textAlignment = UITextAlignmentRight;
                attributeCell.selectionStyle = UITableViewCellSelectionStyleNone;
                [attributeCell.contentView addSubview: self.equipTypeField];
                break;
        return attributeCell;
        }
        break;
    //Operating Info Section
    case 1:
        //Grab First Item in Event Array
        switch (indexPath.row) {
            //Event *recentEvent = [allEvents objectAtIndex:0];

            //Last Update Row
            case 0:
                //Event *recentEvent = [allEvents objectAtIndex:0];
                operatingInfoCell.textLabel.numberOfLines = 0;
                operatingInfoCell.textLabel.textAlignment = UITextAlignmentCenter;
                operatingInfoCell.textLabel.text = @"Last Update";
                //operatingInfoCell.detailTextLabel.baselineAdjustment =  UIBaselineAdjustmentAlignCenters;
                operatingInfoCell.detailTextLabel.text = recentEvent.date;
                return operatingInfoCell;
                break;
            //AvgSpeed Row
            case 1:
                operatingInfoCell.textLabel.numberOfLines = 0;
                operatingInfoCell.textLabel.textAlignment = UITextAlignmentCenter;
                operatingInfoCell.textLabel.text = @"Avg Speed";
                operatingInfoCell.detailTextLabel.text = recentEvent.avgSpeed;          
                return operatingInfoCell;
                break;
            //MaxSpeed Row
            case 2:
                operatingInfoCell.textLabel.numberOfLines = 0;
                operatingInfoCell.textLabel.textAlignment = UITextAlignmentCenter;
                operatingInfoCell.textLabel.text = @"Max Speed";
                operatingInfoCell.detailTextLabel.text = recentEvent.maxSpeed;
                return operatingInfoCell;
                break;
            //Lifetime Row
            case 3:
                operatingInfoCell.textLabel.numberOfLines = 0;
                operatingInfoCell.textLabel.textAlignment = UITextAlignmentCenter;
                operatingInfoCell.textLabel.text = @"Lifetime";
                operatingInfoCell.detailTextLabel.text = recentEvent.lifetime;
                return operatingInfoCell;
                break;
        }
        break;
    //Alert Section

//==========================right here=========================================

    Alert *alert = [[allAlerts objectAtIndex:indexPath.row];
    //[alert retain];
    case 2:
        alertCell.textLabel.text = alert.date;//@"Date";
        alertCell.detailTextLabel.text = @"Alert Message";
        return alertCell;
    //End of Outside Switch Statement
    default:
        break;
    }

    return attributeCell; //For the Compiler
}

Ответы [ 2 ]

7 голосов
/ 05 февраля 2011

Вы можете объявить переменную в регистре оператора switch, используя такие фигурные скобки:

case 2: {
    Alert *alert = [allAlerts objectAtIndex:indexPath.row];

    alertCell.textLabel.text = alert.date;//@"Date";
    alertCell.detailTextLabel.text = @"Alert Message";
    return alertCell;
} break;
0 голосов
/ 04 февраля 2011

Вы можете попробовать объявить:

Alert *alert = nil;

перед оператором switch (возможно, в начале метода) и просто использовать присваивание:

alert = [allAlerts objectAtIndex:indexPath.row];

внутри оператора switchкогда строка действительна.

...