Свободное соединение раскадровки iOS?

У меня очень простое приложение, в котором всего 2 контроллера представления. На начальном корневом контроллере есть две кнопки UIButton, и они оба переходят на второй контроллер представления через раскадровку. Информация, которая загружается во второй контроллер представления, определяется IBAction buttonPressed, который связан с обоими начальными контроллерами представления. Проблема, с которой я сталкиваюсь, заключается в том, что как только я нажимаю одну из двух кнопок, я получаю пустой контроллер второго представления. Из отладки я заметил, что функция buttonPressed вызывается после загрузки второго представления. Как я могу сделать так, чтобы функция buttonPressed вызывалась ДО того, как второй контроллер представления был загружен пустым?

Вряд ли какой-либо код задействован, у меня есть оба UIButtons с тегами 1 и 2, а функция нажатия кнопки загружает два текстовых файла в зависимости от тега отправителя, равного 1 или 2. Все связано в раскадровке. Какие-либо предложения?

* Функция buttonPressed:

if([тег отправителя] == 1)

count = 1;

еще

count = 2;

Счетчик определяет загружаемый файл.

* В раскадровке у меня есть только 2 контроллера представления (без навигации или чего-либо подобного) и два UIButtons в начальном представлении и текстовое представление во втором для отображения текста. UIButtons подключены к buttonPressed и к переходу контроллера второго представления.


person James Brown    schedule 16.05.2012    source источник
comment
Можете ли вы показать код для вашего действия кнопки? Кроме того, вы используете переходы для переключения контроллеров просмотра? У вас есть UINavigationController?   -  person Martol1ni    schedule 16.05.2012
comment
Я отредактировал это, надеюсь, теперь это имеет больше смысла.   -  person James Brown    schedule 16.05.2012
comment
У каждой кнопки есть свой переход или вы используете один и тот же переход для обоих?   -  person Justin Paulson    schedule 16.05.2012
comment
Отдельный переход для обеих кнопок, но они находятся в одном месте.   -  person James Brown    schedule 16.05.2012


Ответы (2)


Это похоже на дело для prepareForSegue!

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"First Button Segue Identifier"])
    {
        ViewController *theViewController = segue.destinationViewController;
        theViewController.textProperty = self.firstButtonText;
    } 
    else if ([[segue identifier] isEqualToString:@"Second Button Segue Identifier"])
    {
        ViewController *theViewController = segue.destinationViewController;
        theViewController.textProperty = self.secondButtonText;
    }
}

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

Удачи!

person Justin Paulson    schedule 16.05.2012
comment
Могу ли я сначала реализовать viewController в раскадровке и программно установить пункт назначения в prepareForSegue? - person James Brown; 17.05.2012
comment
нет, место назначения задается в раскадровке. UIStoryboardSegue имеет свойство для destinationViewController, которое указывает на контроллер представления, на который вы ссылаетесь в своей раскадровке. Итак, что мы здесь делаем, так это извлекаем этот viewController из свойства перехода и присваиваем свойствам этого представления любую информацию, которую мы хотим. Вам нужно будет заменить ViewController тем, что вы назвали своим вторым классом контроллера представления, и textProperty любым свойством, которое вы используете, чтобы определить, какой текст отображать. - person Justin Paulson; 17.05.2012
comment
если я переопределю функцию prepareForSegue, придется ли мне с этого момента управлять каждым переходом во всем проекте? - person James Brown; 17.05.2012
comment
Нет, вы не управляете переходом. Эта функция ничего не делает, пока вы не заставите ее что-то делать. Переход будет переходить сам по себе, это просто позволяет вам сделать паузу перед переходом и подготовиться к переходу. Переход все равно произойдет, несмотря ни на что. У вас может быть 15 различных переходов, и вы поймаете только два из них в этой функции и на самом деле что-то сделаете, а остальные 13 просто продолжат работу, как будто ничего не произошло. - person Justin Paulson; 17.05.2012
comment
это сработало! Все, что я сделал, это добавил свой код buttonPressed в prepareForSegue. Не очень эффективно, но работало. Спасибо за вашу помощь. - person James Brown; 17.05.2012
comment
Это все, что вам нужно было сделать;) См. buttonPressed использует тот же отправитель, что и prepareForSegue, поэтому, если вы используете отправителя в buttonPressed для выполнения своей работы, тогда тот же код должен работать в prepareForSegue... должен был сказать, что с самого начала, я думаю . - person Justin Paulson; 17.05.2012

Не беспокойтесь об IBAction для нажатой кнопки. Переключите кнопки на новый контроллер и используйте prepareForSegue:sender:, чтобы выяснить, какая кнопка была нажата (отправитель).

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

SecondController *next = (SecondController *)[segue destinationViewController];

... и указать, какой файл загружать, что он может сделать в viewDidLoad:.

person Phillip Mills    schedule 16.05.2012
comment
Чем это решение лучше, чем IBAction? - person James Brown; 16.05.2012
comment
Это не зависит от порядка вызываемых вещей и использует тот факт, что вы используете раскадровку. - person Phillip Mills; 17.05.2012
comment
Ну почему здесь неправильный порядок? Почему функция buttonPressed не вызывается сразу, а затем загружается представление? - person James Brown; 17.05.2012
comment
Я не уверен, что это неправильно, потому что я нигде не знаю, чтобы они определяли, что произойдет первым. Например, я знаю, что если переход происходит из ячейки таблицы, порядок не такой, как я ожидал. - person Phillip Mills; 17.05.2012
comment
Ну, это тестовое приложение, которое я сделал для своего большего. ButtonPressed загружается сразу после нажатия, а затем загружает информацию в другое представление. Это работает для 3 из 5 кнопок, а с двумя другими возникает та же проблема, которую я описал выше. - person James Brown; 17.05.2012