Что такое StoryBoard ID и как его использовать?


110

Я новичок в разработке IOS и недавно начал работать с Xcode 4.5. Я видел для каждого viewController, что я могу установить некоторые переменные идентичности, включая идентификатор раскадровки. Что это и как я могу это использовать?

введите описание изображения здесь

Я начал искать в stackoverflow и не смог найти этому объяснения. Я предположил, что это не просто какой-то дурацкий ярлык, который я могу установить, чтобы запомнить свой контроллер, верно? Что оно делает?

Ответы:


132

ID раскадровки - это поле String, которое можно использовать для создания нового ViewController на основе этой раскадровки ViewController. Пример использования будет из любого ViewController:

//Maybe make a button that when clicked calls this method

- (IBAction)buttonPressed:(id)sender
{
    MyCustomViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

   [self presentViewController:vc animated:YES completion:nil];
}

Это создаст MyCustomViewController на основе ViewController раскадровки, который вы назвали «MyViewController», и представит его над текущим контроллером представления.

И если вы являетесь делегатом своего приложения, вы можете использовать

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                         bundle: nil];

Изменить: Swift

@IBAction func buttonPressed(sender: AnyObject) {
    let vc = storyboard?.instantiateViewControllerWithIdentifier("MyViewController") as MyCustomViewController
    presentViewController(vc, animated: true, completion: nil)
}

Изменить для Swift> = 3:

@IBAction func buttonPressed(sender: Any) {
    let vc = storyboard?.instantiateViewController(withIdentifier: "MyViewController") as! ViewController
    present(vc, animated: true, completion: nil)
}

и

let storyboard = UIStoryboard(name: "MainStoryboard", bundle: nil)

Давайте попробуем, и как вы получитеself.storyboard
RTB

Доступ к self.storyboard можно получить из любого контроллера просмотра. Сейчас я отредактирую свой ответ, чтобы вы могли видеть
Эрик

А что, если нужно получить к нему доступ из моего AppDelegate или любого другого класса?
RTB

Добавлено еще одно изменение, показывающее, как получить доступ к раскадровке из любого файла.
Эрик

1
self.storyboardможно получить доступ из любого контроллера представления, который был загружен из раскадровки. Если контроллер представления не был загружен из раскадровки, это свойство равно нулю.
Роб Майофф

13

Чтобы добавить к ответу Эрика и обновить его для Xcode 8 и Swift 3:

ID раскадровки делает именно то, что подразумевает название: он идентифицирует. Только то , что он идентифицирует в контроллер представления в файле раскадровки. Так раскадровка узнает, какой контроллер представления какой.

Пусть вас не смущает название. Идентификатор раскадровки не идентифицирует «раскадровку». Раскадровка, согласно документации Apple, «представляет собой контроллеры представления для всего или части пользовательского интерфейса вашего приложения». Итак, когда у вас есть что-то вроде изображения ниже, у вас есть раскадровка под названием Main.storyboard, которая имеет два контроллера представления, каждому из которых может быть присвоен идентификатор раскадровки (их идентификатор в раскадровке).

введите описание изображения здесь

Вы можете использовать идентификатор раскадровки контроллера представления для создания и возврата этого контроллера представления. Затем вы можете манипулировать им и представлять его, как хотите. Чтобы использовать пример Эрика, скажем, вы хотите представить контроллер представления с идентификатором MyViewController при нажатии кнопки, вы бы сделали это следующим образом:

@IBAction func buttonPressed(sender: Any) {
    // Here is where we create an instance of our view controller. instantiateViewController(withIdentifier:) will create an instance of the view controller every time it is called. That means you could create another instance when another button is pressed, for example.
    let vc = storyboard?.instantiateViewController(withIdentifier: "MyViewController") as! ViewController
    present(vc, animated: true, completion: nil)
}

Обратите внимание на изменения в синтаксисе.


Желтый значок предупреждения указывает на то, что второй контроллер представления не имеет точки входа и / или идентификатора. Это можно решить, присвоив ему идентификатор раскадровки или подключив его к другому контроллеру представления в раскадровке. Таким образом, раскадровка знает, как ее найти и идентифицировать.
Taiwosam

Мне не удалось найти поле ID раскадровки, поэтому спасибо за картинку. Он находится в том же положении на Xcode 9.
Исаак Боска
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.