2013-09-13 4 views
24

У меня слишком много просмотров на одной раскадровке, что заставляет ее работать очень медленно. Мне сказали, что решение этой проблемы будет состоять в том, чтобы разбить одну раскадровку на несколько раскадровки. Может ли кто-нибудь сказать мне, как я могу перейти из представления на раскадровке 1 к представлению в раскадровке 2 с помощью кнопки?Segue из одной раскадровки в другую раскадровку?

ответ

6

Я пробовал все, что читал, но все равно не имел успеха. мне удалось заставить его работать, используя Rob Browns Storyboard Link Это легко осуществить, и работает очень быстро

+0

Я бы определенно рекомендовал его. Я использовал его для нескольких приложений сейчас, и это просто так просто – BrownEye

2

Прежде всего, разбить раскадровку на несколько отдельных - это отличная идея, которая избавляет от головной боли (особенно если вы находитесь в команде и имеете дело с большим количеством конфликтов слияния в файле раскадровки).

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

- (IBAction)buttonPressed:(id)sender { 

    UIViewController *otherVC = [[UIStoryboard storyboardWithName:@"SecondStoryboard" bundle:nil] instantiateInitialViewController]; //Or get a VC by its identifier 

    [self.navigationController pushViewController:otherVC animated:YES]; 
} 

Просто загрузите другую раскадровку и либо звоните instantiateInitialViewController, либо instantiateViewControllerWithIdentifier:, тогда сделайте любой переход, который вы хотели бы.

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

+0

Таким образом, вы просто ссылаться на раскадровку, и она будет непосредственно перейти к исходному ViewController в этой раскадровке? – BrownEye

+0

Я создал две раскадровки, поместил кнопку на VC на первом и сделал ее buttonPressed. Он не ссылается на второй, приложение просто падает. Я все еще довольно новичок в Obj C, поэтому я не уверен, что то, что я сделал, даже правильно. Является ли код, который вы разместили, только тот код, который мне нужен? – BrownEye

+0

@BrownEye, все зависит. Вы используете навигационный контроллер в первой раскадровке? Этот код просто показывает, как получить VC со второй раскадровки. Вы не можете переходить между ними, это ручной процесс. Какая катастрофа вы получаете? –

9

Другое решение с использованием перетекает (IOS SDK 6.0+), которая хранит код, разделенные цели и оставляет место для настройки:

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender { 
    //check/validate/abort segue 
    return YES; 
}//optional 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    //sender - segue/destination related preparations/data transfer 
} 

#pragma mark - Table view delegate 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UIViewController *destination = [[UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil] instantiateInitialViewController]; 

    UIStoryboardSegue *segue = [UIStoryboardSegue segueWithIdentifier:@"identifier" source:self destination:destination performHandler:^(void) { 
     //view transition/animation 
     [self.navigationController pushViewController:destination animated:YES]; 
    }]; 

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
    [self shouldPerformSegueWithIdentifier:segue.identifier sender:cell];//optional 
    [self prepareForSegue:segue sender:cell]; 

    [segue perform]; 
} 

Примечание:UITableViewCell *cell используется как senderсохранить по умолчанию поведение TableViewController ответа.

+0

Отличное решение Nocross, спасибо! Я вижу, что ваш фрагмент делает «Push» segue. Я адаптировал его, чтобы выполнить «Заменить», изменив код в блоке на '(void) setViewControllers: (NSArray *) viewControllers animated: (BOOL) animated' – jbbenni

17

В Swift (IOS 8.1) это довольно легко:

var storyboard: UIStoryboard = UIStoryboard(name: "Another", bundle: nil) 
    var vc = storyboard.instantiateViewControllerWithIdentifier("NextViewController") as AnotherViewController 
    self.showViewController(vc, sender: self) 

Обновление для Swift 3:

let storyboard: UIStoryboard = UIStoryboard(name: "Another", bundle: nil) 
let vc = storyboard.instantiateViewController(withIdentifier: "NextViewController") as! AnotherViewController 
self.show(vc, sender: self) 
2

Вот простой Swift решение:

let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as UIViewController 
    // .instantiatViewControllerWithIdentifier() returns AnyObject! this must be downcast to utilize it 

    self.presentViewController(viewController, animated: false, completion: nil) 
4

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

27

С Xcode 7 вы можете выбрать Раскадровка Ссылки

enter image description here

и установить раскадровку назначения и контроллер

enter image description here

+1

Это отличное новое дополнение, спасибо, что указали его! – BrownEye

0

Swift 3

let vc = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerIdentifier") as? ExpectedViewControllerClass 
self.show(vc, sender: self) 

Где "StroboardName" это имя вашего .storyboardfile. «ViewControllerIdentifier» - это идентификатор представления в доске объявлений. И «я» любой UIViewController

In my case, the identifier was "chooseCountryViewController"

Смежные вопросы