У меня слишком много просмотров на одной раскадровке, которая заставляет ее работать очень медленно. Мне сказали, что решение этой проблемы будет состоять в том, чтобы разбить одну раскадровку на несколько раскадровки. Может ли кто-нибудь сказать мне, как я могу перейти из представления на раскадровке 1 к представлению в раскадровке 2 с помощью кнопки?
Сеге из одной раскадровки в другую раскадровку?
Ответ 1
Я пробовал все, что читал, но все равно не имел успеха. Мне удалось заставить его работать с помощью Разрушителя Роба Браунса Он легко реализуется и работает очень быстро
Ответ 2
С помощью Xcode 7 вы можете выбрать ссылки для раскадровки
и установите целевую раскадровку и контроллер
Ответ 3
Добавление ссылки на другую раскадровку - документ разработчика Apple
Ответ 4
В 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)
Ответ 5
Другое решение, использующее segues (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
.
Ответ 6
Наконец, XCode 7 добавил эту функцию, в которой вы можете переходить между контроллерами представлений в двух разных раскадках с использованием построителя интерфейса. До сих пор мы должны были делать это программно.
Ответ 7
Прежде всего, разбить раскадровку на несколько отдельных - это отличная идея, которая избавляет от большой головной боли (особенно если вы находитесь в команде и имеете дело с большим количеством конфликтов слияния в файле раскадровки).
Теперь, чтобы ответить на ваш вопрос - вы не можете выполнить segue между двумя раскадками обязательно, но одно решение, с которым я имел большой успех, - это сделать что-то вроде этого:
- (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:
, затем выполните любой переход, который вы хотели бы.
Надеюсь, что это поможет.
Ответ 8
Вот простое решение 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)
Ответ 9
Swift 3
let vc = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerIdentifier") as? ExpectedViewControllerClass
self.show(vc, sender: self)
Где "StroboardName" - это имя вашего .storyboardfile. "ViewControllerIdentifier" - это идентификатор представления в доске объявлений. И "я" - это любой UIViewController
В моем случае идентификатор был "selectCountryViewController"