ฉันจะโหลดกระดานเรื่องราวแบบเป็นโปรแกรมจากชั้นเรียนได้อย่างไร


183

ปัญหาของฉันคือว่าผมกำลังมองหาวิธีการที่จะใช้ทั้งกระดานและXib แต่ฉันไม่สามารถหาวิธีที่เหมาะสมในการโหลดและแสดงกระดานเรื่องราวแบบเป็นโปรแกรม โครงการเริ่มพัฒนาด้วย xib และตอนนี้มันยากมากที่จะซ้อนไฟล์ xib ทั้งหมดไว้ในกระดานเรื่องราว ดังนั้นฉันจึงกำลังมองหาวิธีที่จะทำในรหัสเช่นalloc, init, pushสำหรับ viewControllers ในกรณีของฉันฉันมีคอนโทรลเลอร์เพียงหนึ่งตัวเท่านั้นในกระดานเรื่องราว: UITableViewControllerซึ่งมีสแตติกเซลล์ที่มีเนื้อหาบางส่วนที่ฉันต้องการแสดง หากใครรู้วิธีที่เหมาะสมในการทำงานทั้งกับ xib และกระดานเรื่องราวโดยไม่ต้องทำการปรับเปลี่ยนครั้งใหญ่ฉันจะขอบคุณสำหรับความช่วยเหลือ

คำตอบ:


370

ในกระดานเรื่องราวของคุณไปที่ตัวตรวจสอบคุณสมบัติและตั้งค่าตัวระบุมุมมอง จากนั้นคุณสามารถแสดงตัวควบคุมนั้นโดยใช้รหัสต่อไปนี้

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];

65
[sb instantiateInitialViewController]มีประโยชน์ถ้าคุณต้องการเริ่มต้นบนตัวควบคุมมุมมองเริ่มต้นของฉาก
drewish

เจมส์ขอบคุณ! ฉันค้นหามาระยะหนึ่งแล้วพยายามหาวิธีทำให้มุมมองของสตอรีบอร์ดดูตัวอย่าง คำตอบของคุณ (และคำถามของ kokoko) สดชื่นที่สุดในการค้นหา
bejonbee

ในโค้ดของ James Beith เราต้องนำ UIViewControler * vc นั้นกลับมาใช้ใหม่หากมีการสลับไปมาด้วยตัวควบคุมปัจจุบัน ฉันค้นพบวิธีที่ยากลำบากที่ vc เกาะติดอยู่รอบ ๆ และเชื่อมต่อกับกระดานเรื่องราวที่ผู้ใช้กดปุ่มบนมุมมองใหม่และขณะนี้มีหน่วยความจำรั่วด้วย vc ที่ถูกละทิ้งจากการใช้รหัสก่อนหน้านี้
SWoo

11
ในกรณีที่ทุกคนต้องการที่จะทราบวิธีการทำเช่นนี้ในผู้ร่วมประชุม app ที่คุณเปลี่ยน[self presentViewcontroller]ตรรกะที่มีเส้นเหล่านี้ในลำดับต่อไปนี้: 1) self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];2) self.window.rootViewController = vc;และ [self.window makeKeyAndVisible];3) นอกจากนี้คุณยังสามารถกำจัดmodalTransitionStyleสายเพราะนี่ไม่ใช่การเปลี่ยนกิริยาจากตัวแทนแอป
lewiguez

ถ้าคุณต้องการที่จะ "ดัน" กระดานเรื่องราวใหม่แทนที่จะโผล่ขึ้นมาอย่างสุภาพดูคำตอบของ chaithraVeeresh
Adam Johns

76

สวิฟท์ 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 สตอรีบอร์ดให้กับคอนโทรลเลอร์มุมมองของคุณ

ID สตอรีบอร์ด

IB> แสดงตัวตรวจสอบตัวตน> ตัวตน> ID สตอรีบอร์ด

Swift (ดั้งเดิม)

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") as? UIViewController
self.navigationController!.pushViewController(vc!, animated: true)

แก้ไข: Swift 2 แนะนำในความคิดเห็นโดยFred A.

ถ้าคุณต้องการใช้โดยไม่ต้องใช้ navigationController ใด ๆ คุณต้องใช้ดังนี้:

    let Storyboard  = UIStoryboard(name: "Main", bundle: nil)
    let vc = Storyboard.instantiateViewController(withIdentifier: "viewController")
    present(vc , animated: true , completion: nil)

1
ใน Swift 2 คุณไม่จำเป็นต้องเพิ่ม "as? UIViewController" คอมไพเลอร์จะกำหนดโดยอัตโนมัติ
Frédéric Adda

2
หรือคุณสามารถทำself.storyboardและรวมบรรทัด 1 และ 2
น้ำผึ้ง

17

ในตัวตรวจสอบคุณลักษณะให้ตัวระบุสำหรับตัวควบคุมมุมมองนั้นและโค้ดด้านล่างใช้งานได้สำหรับฉัน

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
[self.navigationController pushViewController:detailViewController animated:YES];

5

ลองสิ่งนี้

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"Login"];

[[UIApplication sharedApplication].keyWindow setRootViewController:vc];

ใช้สิ่งนี้หากคุณไม่ได้ใช้ UINavigationController ดังที่แสดงในคำตอบอื่น ๆ
latenitecoder

2

ใน Swift
NavigationControllerและpushControllerคุณสามารถแทนที่ได้

present(vc, animated:true , completion: nil)

1

สำหรับswift 3 และ 4คุณสามารถทำได้ แนวปฏิบัติที่ดีคือตั้งชื่อของกระดานเรื่องราวเท่ากับ StoryboardID

enum StoryBoardName{
   case second = "SecondViewController"
}
extension UIStoryBoard{
   class func load(_ storyboard: StoryBoardName) -> UIViewController{
      return UIStoryboard(name: storyboard.rawValue, bundle: nil).instantiateViewController(withIdentifier: storyboard.rawValue)
   }
}

และจากนั้นคุณสามารถโหลดสตอรี่บอร์ดของคุณใน ViewController ดังนี้:

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)
     }

}

เมื่อคุณสร้าง Storyboard ใหม่ให้ตั้งชื่อเดียวกันบน StoryboardID และเพิ่มชื่อ Storyboard ใน enum ของคุณ " StoryBoardName "


0

คุณสามารถกระโดดไปยังรูทคอนโทรลเลอร์ได้เสมอ:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [storyboard instantiateInitialViewController];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];

0

นามสกุลดังต่อไปนี้จะช่วยให้คุณโหลดและก็เกี่ยวข้องStoryboard UIViewControllerตัวอย่าง: หากคุณมีUIViewControllerชื่อModalAlertViewControllerและกระดานเรื่องราวชื่อ "ModalAlert" เช่น

let vc: ModalAlertViewController = UIViewController.loadStoryboard("ModalAlert")

จะโหลดทั้งสองStoryboardและUIViewControllerและจะเป็นประเภทvc หมายเหตุถือว่าสตอรี่บอร์ดของ Storyboard ID มีชื่อเดียวกับสตอรี่บอร์ดและที่สตอรี่บอร์ดที่ได้รับการทำเครื่องหมายว่าคือเริ่มต้นดูควบคุมModalAlertViewController

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
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.