Проблема с отправкой объектов NSString из UITableViewController в UIViewController (с использованием раскадровок) - PullRequest
3 голосов
/ 31 марта 2012

так что у меня эта проблема, которая сводит меня с ума в течение нескольких часов, и я чувствую себя настолько глупо, потому что это кажется таким простым.Я искал в Интернете и возился с кодом в течение последних 3 часов, но до сих пор не могу понять: (

Перед тем, как начать, я использую Xcode 4.3.1 и тестирую на iOS5.1 (и симулятор, и физическое устройство).

Итак, вот что я сделал до сих пор:

  • Используйте раскадровки для соединения всех моих представлений
  • Один измои представления - это UITableViewController, и он ссылается на UIViewController (используя push, и он работает корректно, переключаясь между двумя представлениями)
  • Подкласс UITableViewController называется ScheduleViewController
  • Подкласс UIViewController называется EventViewController
  • Я уже заполнил все мои разделы и ячейки таблицы соответствующим содержимым (я использую textLabel и detailTextLabel (это не проблема) - Для UIViewController я только добавилпометить и сгенерировать IBOutlet для метки: headerLabel

Вот что я пытаюсь сделать:

  • Когда пользователь щелкает ячейку таблицы в ScheduleViewController, переходите к EventViewController (до этого момента это работает!)
  • На основе выбранной ячейки таблицы передайте textLabel.text, detailTextLabel.textи заголовок раздела текста в EventViewController (вроде работает, все значения отображаются с NSLog, но это все ???)
  • Я подумал, что лучше начать с малого, поэтому я собираюсь начать с установки текста headerLabel(в EventViewController), к тексту заголовка раздела (в ScheduleViewController) - Это снова работает, когда я проверяю значение с помощью NSLog, но когда я пытаюсь установить фактический текст headerLabel, он просто отображает и пустую строку:(

Вот где я застрял и что я пытался до сих пор:

  • Ну, во-первых, я уже сделал что-то точно так же (за исключением того, что это было с iOS 4, и я не использовал раскадровки), то, что я сделал, было в didSelectRowAtIndexPath: метод в UITableViewController, я просто сделал sчто-то вроде (и работало нормально :)):

    EventViewController * eventViewController = [[EventViewController alloc] initWithNibName: @ "EventViewController" bundle: nil];eventViewController.headerLabel.text = stringToPass;

  • Конечно, это было первое, что я попробовал, и, конечно, это не сработало, потому что программирование - это просто ха-ха.

  • Итак, я создал собственный метод init в своем EventViewController:

    • (id) initEventTime: (NSString *) eventTime andName: (NSString *) eventName andDate:(NSString *) eventDate;
  • Сначала я попытался вызвать его в didSelectRowAtIndexPath: метод в ScheduleViewController, и это вроде работает, вот метод в EventViewController:

    //Method to initialize event time, name, and date.
    
    • (id) initEventTime: (NSString *) eventTime andName: (NSString *) eventName andDate: (NSString *) eventDate {self = [super initWithNibName: @ "EventViewController" bundle: nil];if (self) {NSLog (@ "my custom");// Пользовательская инициализация

      // NSLog (@ "% @", eventTime);// NSLog (@ "% @", именем_событие);// NSLog (@ "% @", EVENTDATE);NSString * mystr = [NSString stringWithFormat: @ "% @", eventDate];NSLog (@ "1:% @", mystr);[self setTheEventDate: eventDate];NSString * mystr2 = [self getTheEventDate];NSLog (@ "2:% @", mystr2);headerLabel.text = [self getTheEventDate];NSLog (@ "label:% @", headerLabel.text);NSLog (@ "3:% @", eventDate);

      // self.headerLabel.text = [NSString stringWithFormat: @ "% @", eventDate];} вернуть себя;}

  • И вот как я вызвал метод в didSelectRowAtIndexPath: метод (в ScheduleViewController):

    EventViewController * evc = [[EventViewControlleralloc] initEventTime: timeValue andName: eventValue andDate: dateValue];

  • Итак, как вы можете видеть выше, я сначала проверил, появились ли значения в окне вывода с помощью NSLog, и все они сделали!

  • Но когда я пытался установить headerLabel, текст все равно возвращал пустую строку
  • Итак, я попытался создать метод получения и установки (как вы можете видеть выше) в EventViewController, который называется getTheEventDate и setTheEventDate.
  • В этих методах я просто устанавливаюTheEventDate, используя аргумент eventDate, а затем получаю значение; и снова он появился в окне вывода, но пустая строка headerLabel
  • Я также пытался использовать NSLog, чтобы получить значение eventDate, NSLog, чтобы получить текстовое значение headerLabel, и другой NSLog, чтобы убедиться, что eventDate не был нулевым.
  • Вот вывод из окна вывода:

    2012-03-31 мой заказ 2012-03-31 28 июля 2012-03-31 2: 28 июля 2012-03-31 ярлык: (ноль) 2012-03-31 3: 28 июля

1 Ответ

0 голосов
/ 31 марта 2012

Если ваши контроллеры представления загружаются из раскадровки, то все, что касается перьев, будет плохой идеей.: -)

Волшебный метод для обработки переходов раскадровки - prepareForSeque :.Взгляни на это;segue имеет ссылки на задействованные контроллеры, а параметр отправителя связывает вас с элементом управления, который инициировал действие.

Редактировать:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    EventViewController *next = (EventViewController *)[segue destinationViewController];
    next.headerLabel.text = @"Hello!";
}

В реальном коде вам потребуетсяотправителю, чтобы узнать, какую именно информацию нужно передать, запросив у таблицы путь индекса отправителя или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...