Совместное использование выбора didSelectRowAtIndexPath в массиве между двумя контроллерами - PullRequest
0 голосов
/ 16 декабря 2009

В моем бесконечном квесте поделиться выделением строки таблицы для нескольких представлений, загруженных в модальном представлении, я рассмотрел одну проблему. Я использую пример кода Apples DrillDownSave в качестве модели, чтобы воссоздать эту магию. И думаю, что я все настроил точно так же ...

В разделе didSelectRowAtIndexPath моего RootViewController.m у меня есть следующий код для копирования violinMakers MSMutableArray в подробный вид MSMuteableArray с тем же именем. Все цветовое кодирование и отсутствие ошибок говорит мне, что я на правильном пути .. но ..

detailsView.violinMakers = [violinMakers objectAtIndex:indexPath.row];

в файле RootviewController.h Я ссылаюсь на DetailsViewController через:

@class DetailViewController

DetailsViewController *detailsView;
NSMutableArray *violinMakers; 
@property (nonatomic, retain) NSMutableArray *violinMakers;

Затем в файле DetailsViewController .h:

NSMutableArray *violinMakers;
IBOutlet UITextView *violinMakerDescription;
@property (nonatomic, retain) NSMutableArray *violinMakers; //tried assign or copy no difference
@property (nonatomic, retain) IBOutlet UITextView *violinMakerDescription;

А в файле DetailsViewController .m:

- (void)viewWillAppear:(BOOL)animated
ViolinMaker *violinMaker = (ViolinMaker *)violinMakers;
[violinMakerDescription setText: [violinMaker description]];
 NSLog(@"violinMakerDescription in detailsView: %@", [violinMaker description]);

У меня есть отдельный класс, как видно выше, который я использую для определения данных violinMaker. Это прекрасно работает в контроллере rootview внутри didSelectRowAtIndexPath, поэтому я знаю, что это не является частью проблемы, я, конечно, ссылаюсь на это в файле .m. Все это подключается в IB как обычно, так как я проверяю, что он работает, просто выталкивая DetailsViewController напрямую из rootViewController, и данные прекрасно загружаются в UITextView.

Я запускаю DetailsViewController из push-представления (работает отлично) из RootviewController (tableViewColler), и он запускается как модальное представление:

DetailsViewController *detailsViewController = [[DetailsViewController alloc] initWithNibName:@"DetailsViewController" bundle:nil ];
UINavigationController *aDetailsViewController = [[UINavigationController alloc] initWithRootViewController:detailsViewController];

[self presentModalViewController:aDetailsViewController animated:YES];

// [violinMakerView release];
[DetailsViewController retain]; // or release no different
[aDetailsViewController release];

Я не получаю ошибок при сборке и просмотре загрузок, но информация в textView пуста. Это также говорит мне, что он ничего не загружает и подключен правильно ... Я так близко ... Но я могу видеть из моего NSLog, что это значение:

violinMakerDescription in detailsView: (null)

так что violinMaker из RootviewController не копируется в массив violinMakers в DetailsViewController. Мне неприятно это признавать, но в течение нескольких недель я пробовал различные решения, чтобы заставить это работать, хотя appDelegate, через NSDictionary и все другие способы безрезультатно. Я думаю, что ответ заключается в выпуске violinMaker, поэтому просто ничего не передается или строка назначения в RootViewController не работает. Кто-нибудь знает, что я могу изменить?

Я действительно был бы признателен за некоторую помощь, я просто не понимаю, чего мне не хватает, но это самое близкое, что я получил, мне просто нужна правильная ссылка или я вижу, почему значения не сохраняются. Если есть способ проверить, когда значения выпущены, я мог бы проверить эту проблему, может быть, это так. Я пытался сохранить его везде (и исправить после того, как я заставил его работать), но он просто не работает ... помогите ??

Спасибо всем !!!

С уважением, Кирк

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

[detailsView.violinMakers addObject: [violinMakers objectAtIndex:indexPath.row]];

@ Frank Во-первых, спасибо за вашу помощь в этом !! Я устанавливаю объект violinMaker в rootViewController таким же образом, и он там работает нормально, как показано ниже:

violinMaker = [self.violinMakers objectAtIndex:indexPath.row];

        ViolinMakerViewController *violinMakerViewController = [[ViolinMakerViewController alloc] initWithNibName:@"ViolinMakerViewController" bundle:nil];
        self.violinMakerView = violinMakerViewController;

        [[self navigationController] pushViewController:violinMakerView animated:YES];


        [self.violinMakerView.violinMakerName setText:[violinMaker name]];
    ....
        [self.violinMakerView.violinMakerDescription setText:[violinMaker description]];

        NSLog(@"violinMaker description variable in RootView: %@", [violinMaker description]);

        DetailsViewController.violinMakers = [violinMakers objectAtIndex:indexPath.row];

Здесь я вижу, что в NSLog он прекрасно загружается, поэтому я полагал, что загрузка его здесь в массив из objectAtIndex: indexPath.row с последующим копированием этого массива и помещением его в объект ViolinMaker из DetaisViewController будет работать. Я не хотел заново создавать объект ViolinMaker внутри DetailsViewController, просто перезагрузить его из массива, как это было из RootViewController.

Вот как это делает пример DrillDownSave Apple, и я отразил эту конфигурацию. Где в level1ViewController в didSelectRowAtIndex следующий код

// provide the 2nd level its content
level2ViewController.listContent = [[listContent objectAtIndex:indexPath.row] objectForKey:kChildrenKey];

Мне не нужна ключевая часть, так как она предназначена для вызова местоположения. Оба контроллера в этом примере кода используют NSArrays с одинаковыми именами, и он, похоже, копирует массив L1 в массив L2 через эту строку.

Они используют проталкиваемые TableViews, что упростит, но я не просто делаю это, IBOutlets для загрузки информации в UITextView, поэтому я должен выполнить присвоение массива в контроллере RootView, где происходит выбор.Если бы я мог просто сохранить ViolinMaker, назначенный в контроллере RootView, я мог бы тогда просто взять его в Подробности, но я не могу понять это тоже ....

Спасибо за помощь, я действительно застрял ..

1 Ответ

1 голос
/ 16 декабря 2009

Я думаю, суть проблемы заключается в этой строке:

ViolinMaker *violinMaker = (ViolinMaker *)violinMakers;

Вы присваиваете адрес NSMutableArray объекта violinMaker. Если я правильно понимаю, violinMakers это массив ViolinMaker объектов. В этом случае вы хотели бы:

ViolinMaker *violinMaker = [violinMakers objectAtIndex:index];

Вам нужно будет захватить индекс в процедуре didSelectRowAtIndexPath:. На самом деле лучший способ сделать это может быть следующим:

  1. Измените ваш DetailsViewController, чтобы иметь одно свойство violinMaker (не массив)
  2. После выделения вашего DetailsViewController установите свойство violinMaker:

    detailsViewController.violinMaker = [violinMakers objectAtIndex: indexPath.row];

Затем удалите приведение (первый пример кода), и вы должны быть в основном там.

К сожалению, Objective-C / XCode не годится для «кодирования IntelliSense», как VS200x / .NET. Вероятно, было бы целесообразно пройти через несколько учебных пособий, а затем вернуться к этому проекту.

...