수업에서 스토리보드를 프로그래밍 방식으로 로드하려면 어떻게 해야 합니까?
저의 문제는 스토리보드와 xib를 모두 사용할 수 있는 방법을 찾고 있었다는 것입니다.하지만 스토리보드를 프로그래밍 방식으로 로드하고 표시하는 적절한 방법을 찾을 수 없습니다.프로젝트는 xib로 개발하기 시작했고, 이제 모든 xib 파일을 스토리보드에 중첩하기가 매우 어렵습니다.그래서 코드로 하는 방법을 찾고 있었어요, 예를 들면.alloc, init, push
viewController용입니다.이 경우 스토리보드에 컨트롤러가 하나밖에 없습니다.UITableViewController
제가 보여드리고 싶은 내용이 있는 정적인 세포를 가지고 있습니다.큰 리팩터링 없이 xib와 스토리보드로 작업할 수 있는 적절한 방법을 아는 사람이 있다면 도움을 주시면 감사하겠습니다.
스토리보드에서 Attributes inspector(속성 검사기)로 이동하여 뷰 컨트롤러의 Identifier(식별자)를 설정합니다.그런 다음 다음 다음 코드를 사용하여 해당 보기 컨트롤러를 표시할 수 있습니다.
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];
스위프트 3
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "viewController")
self.navigationController!.pushViewController(vc, animated: true)
스위프트 2
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController")
self.navigationController!.pushViewController(vc, animated: true)
전제 조건
스토리보드 ID를 보기 컨트롤러에 할당합니다.
IB > Identity inspector 표시 > Identity > 스토리보드 ID
Swift(레거시)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") as? UIViewController
self.navigationController!.pushViewController(vc!, animated: true)
편집: Fred A의 코멘트에서 Swift 2가 제안되었습니다.
내비게이션 컨트롤러 없이 사용하려면 다음과 같이 사용해야 합니다.
let Storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = Storyboard.instantiateViewController(withIdentifier: "viewController")
present(vc , animated: true , completion: nil)
속성 검사기에서 해당 뷰 컨트롤러의 식별자를 지정하면 아래 코드가 작동합니다.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
[self.navigationController pushViewController:detailViewController animated:YES];
사용해 보세요.
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"Login"];
[[UIApplication sharedApplication].keyWindow setRootViewController:vc];
신속하게
대체할 수 있는 NavigationController 및 pushController
present(vc, animated:true , completion: nil)
swift 4와 5는 이렇게 할 수 있습니다.모범 사례는 스토리보드의 이름을 스토리보드와 동일하게 설정하는 것입니다.신분증.
enum StoryBoardName{
case second = "SecondViewController"
}
extension UIStoryboard{
class func load(_ storyboard: StoryBoardName) -> UIViewController{
return UIStoryboard(name: storyboard.rawValue, bundle: nil).instantiateViewController(withIdentifier: storyboard.rawValue)
}
}
그런 다음 다음 View 컨트롤러에 스토리보드를 로드할 수 있습니다.
class MyViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
guard let vc = UIStoryboard.load(.second) as? SecondViewController else {return}
self.present(vc, animated: true, completion: nil)
}
}
새 스토리보드를 만들 때 스토리보드에서 동일한 이름을 설정하기만 하면 됩니다.열거된 "StoryBoardName"에서 StoryBoard 이름을 ID로 추가합니다.
루트 컨트롤러로 언제든지 바로 이동할 수 있습니다.
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [storyboard instantiateInitialViewController];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];
아래의 확장을 통해 다음을 로드할 수 있습니다.Storyboard
그리고 그것은 연관되어 있습니다.UIViewController
예:만약 당신이 가지고 있다면.UIViewController
이름 지어진ModalAlertViewController
예를 들어 "ModalAlert"라는 이름의 스토리보드가 있습니다.
let vc: ModalAlertViewController = UIViewController.loadStoryboard("ModalAlert")
둘 다 로드합니다.Storyboard
그리고.UIViewController
그리고.vc
유형이 될 것입니다.ModalAlertViewController
참고 스토리보드의 스토리보드 ID가 스토리보드와 이름이 같고 스토리보드가 초기 뷰 컨트롤러임으로 표시되었다고 가정합니다.
extension UIViewController {
/// Loads a `UIViewController` of type `T` with storyboard. Assumes that the storyboards Storyboard ID has the same name as the storyboard and that the storyboard has been marked as Is Initial View Controller.
/// - Parameter storyboardName: Name of the storyboard without .xib/nib suffix.
static func loadStoryboard<T: UIViewController>(_ storyboardName: String) -> T? {
let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
if let vc = storyboard.instantiateViewController(withIdentifier: storyboardName) as? T {
vc.loadViewIfNeeded() // ensures vc.view is loaded before returning
return vc
}
return nil
}
}
언급URL : https://stackoverflow.com/questions/9896406/how-can-i-load-storyboard-programmatically-from-class
'IT' 카테고리의 다른 글
socket.io 과 웹 소켓의 차이점 (0) | 2023.05.13 |
---|---|
판다 다중 지수 - 열을 사용할 때 2단계를 선택하는 방법은 무엇입니까? (0) | 2023.05.13 |
C# 콘솔 앱에서 Ctrl+C(SIGINT)를 어떻게 트랩합니까? (0) | 2023.05.13 |
불변 문화와 순서 문자열 비교의 차이 (0) | 2023.05.13 |
사용자 또는 관리자가 응용프로그램 사용에 동의하지 않았습니다 - 이 사용자 및 리소스에 대한 대화형 권한 부여 요청을 보냅니다. (0) | 2023.05.13 |