Как получить значение переменной NSString из NSObject в ViewController - PullRequest
4 голосов
/ 10 ноября 2011

Я пытаюсь настроить объект для управления всеми моими данными, чтобы он мог настроить все в фоновом режиме, чтобы мои представления таблиц загружались быстрее, чем сейчас, и т. Д.

Это то, чего я пытаюсь достичь.

enter image description here

Я устанавливаю переменную в объекте NSO из второго виртуального контейнера, когда ячейка просмотра таблицы выбрана следующим образом:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Access selected cells content (cell.textLabel.text)
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    //Parent view logic (sends info back to the correct cell in parent view)
    if (parentViewSelectedIndexPath.section == 0) 
    {
        if (parentViewSelectedIndexPath.row == 0) 
        {
            //Predicates restrict the values that will be returned from the query
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"MANUFACTURER",cell.textLabel.text];
            NSArray *filterArray = [myDataArray filteredArrayUsingPredicate:predicate];
            //[[self delegate] setManufactureSearchFields:filterArray withIndexPath:indexPath]; //This is where I pass the value back to the mainview
            //Using Object
            VehicleControllerNSObject *vehicleControllerNSObject = [[VehicleControllerNSObject alloc] init];
            [vehicleControllerNSObject setFirstCell:filterArray];

        }
//etc

В конце вы можете увидеть метод, который настраивается в объекте VechicleControllerNSObject, который выглядит следующим образом.

-(void)setFirstCell:(NSArray *)array{

    manufactureSearchObjectStringFVC = [[array valueForKey:@"MANUFACTURER"] objectAtIndex:0];
    NSLog(@"%@", manufactureSearchObjectStringFVC); // this prints the correct value to the console
}

Как вы можете видеть, печатается правильный вывод.

однако я понятия не имею, как вызвать ManufactureSearchObjectStringFVC и передать значение, которое оно содержит, в ячейку uitableview, которую я хотел бы передать в свой первый контроллер viewview.

Это то, что у меня есть для тестирования банкомата.

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    VehicleControllerNSObject *vehicleControllerNSObject = [[VehicleControllerNSObject alloc] init];
    manufactureSearchObjectString = vehicleControllerNSObject.manufactureSearchObjectStringFVC;
    NSLog(@"%@", vehicleControllerNSObject.manufactureSearchObjectStringFVC);

}

Это nslog печатает ноль ..

У меня три вопроса

1, как мне получить правильное значение в первом контроллере значений.

2, я должен использовать viewDidAppear, как это? .. Я думаю, нет .. как я могу сделать это лучше

3, как вы думаете, это хороший способ сделать такой тип вещей, так как в будущем я хотел бы использовать NSObjectClass для разбора информации, кэширования и т. Д. За чувствами, оставляя представления для отображения только когда данные готов, надеюсь, помогает выступлению ..

Буду очень признателен за любую помощь, так как я действительно хочу изучать этот материал, поскольку я знаю, что для меня важно знать.

Ответы [ 2 ]

4 голосов
/ 10 ноября 2011

Ваш вопрос настолько красиво и четко отформатирован и нанесен на диаграмму, что, кажется, стыдно просить вас выполнить поиск.Но вот оно:

Поиск совместного использования данных между контроллерами представления

Вы найдете много хороших обсуждений по поводу обмена данными между контроллерами представления.

Вкратце, я могу сказать вам, почему ваш код не работает.В вашем методе tableView:didSelectRowAtIndexPath: вы каждый раз создаете (alloc/init) a новый экземпляр вашего класса VehicleControllerNSObject.Затем снова в вашем первом контроллере представления на viewDidAppear :, снова вы каждый раз создаете (alloc/init) совершенно новый экземпляр.

Таким образом, у вас есть несколько объектов, приходящих и уходящих, и они не имеют никакого отношения друг к другу,Это похоже на передачу какой-то важной информации одному человеку на автобусной станции, а затем случайным образом выбирает другого человека и пытается получить ту же информацию от нее.

Так что одна быстрая идея - создать всего один раз.экземпляр вашего VehicleControllerNSObject (только в стороне, это немного странное имя для класса, так как обычно все objective-c объекты являются потомками NSObject в любом случае. Сейчас я просто назову это VehicleController)

Допустим, вы хотели, чтобы значение sharedInstance составило VehicleController.Вы можете добавить метод класса к VehicleController, чтобы дать вам возможность легко получить этот один sharedInstance:

+(VehicleController*)sharedInstance {

    static VehicleController *sharedInstance_ = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        sharedInstance_ = [[VehicleController alloc] init];
    });

    return sharedInstance_;
}

Так что, чтобы получить этот экземпляр в методах других классов, вы можете просто сделать что-то вроде:

VehicleController *sharedController = [VehicleController sharedInstance];
sharedController.someProperty = someValue;

// and then back in your first view controller, similarly:
VehicleController *sharedController = [VehicleController sharedInstance];
id someValue = sharedController.someProperty;

Опять же, проверьте поиск, у многих людей было хорошее обсуждение этого вопроса.Это всего лишь один подход.Надеюсь, по крайней мере, имеет смысл, почему ваш код не работал.

Надеюсь, это поможет.

1 голос
/ 10 ноября 2011

Чтобы ответить на вопрос 3. Нет.

Я думаю, что наилучшим способом сделать что-то подобное было бы использование Core Data и его NSManagedObject.

Комбинация UITableViewController и NSFetchedResultsController, котораяэто подача из резервного хранилища Core Data sqlite, если она правильно настроена и будет поддерживать ваш UITableView обновленным.

Было бы долго описывать все здесь.Поэтому на этом я остановлюсь.

Если вы не хотите идти с этим, всегда есть возможность использовать общие указатели для изменяемого объекта или использовать объект singleton для передачи информации между UIViewController.

...