Làm thế nào tôi có thể tải bảng phân cảnh theo chương trình từ lớp?


183

Vấn đề của tôi là tôi đã tìm cách sử dụng cả bảng phân cảnhxib . Nhưng tôi không thể tìm thấy cách thích hợp để tải và hiển thị bảng phân cảnh theo chương trình. Dự án đã bắt đầu phát triển với xib và bây giờ rất khó để lồng tất cả các tệp xib trong bảng phân cảnh. Vì vậy, tôi đã tìm kiếm một cách để làm điều đó trong mã, giống như với alloc, init, pushviewControllers. Trong trường hợp của tôi, tôi chỉ có một bộ điều khiển trong bảng phân cảnh : UITableViewController, có các ô tĩnh với một số nội dung tôi muốn hiển thị. Nếu bất cứ ai biết cách thích hợp để làm việc với cả xib và bảng phân cảnh mà không cần tái cấu trúc lớn, tôi sẽ đánh giá cao bất kỳ trợ giúp nào.

Câu trả lời:


370

Trong bảng phân cảnh của bạn, hãy đi tới Trình kiểm tra thuộc tính và đặt Mã định danh của trình điều khiển chế độ xem. Sau đó, bạn có thể trình bày bộ điều khiển xem bằng mã sau đây.

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]là tiện dụng nếu bạn muốn bắt đầu trên trình điều khiển xem mặc định của cảnh.
thu hút

James, cảm ơn bạn! Tôi đã tìm kiếm khá lâu để cố gắng tìm ra cách khởi tạo chế độ xem của Storyboard. Câu trả lời của bạn (và câu hỏi của kokoko) rất mới mẻ để tìm.
bejonbee

Trên mã của James Beith, người ta phải sử dụng lại UIViewControler * vc nếu nó được chuyển đổi qua lại với trình điều khiển khung nhìn hiện tại. Tôi phát hiện ra một cách khó khăn là vc dính xung quanh và được nối với ngòi truyện cho đến khi người dùng nhấn nút trên chế độ xem mới, và bây giờ có một rò rỉ bộ nhớ với vc bị loại bỏ từ các câu thần chú trước đó của mã này.
SWoo

11
Trong trường hợp bất kỳ ai muốn biết cách thực hiện điều này trong đại biểu ứng dụng, bạn thay thế [self presentViewcontroller]logic bằng các dòng này theo thứ tự sau: 1) self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];2) self.window.rootViewController = vc;và 3) [self.window makeKeyAndVisible];. Bạn cũng có thể thoát khỏi modalTransitionStyledòng vì đây không phải là một chuyển đổi phương thức từ đại biểu ứng dụng.
lewiguez

FYI, nếu bạn muốn "đẩy" bảng phân cảnh mới thay vì bật lên một cách vừa phải, hãy nhìn vào câu trả lời của chaithraVeeresh.
Adam Johns

76

Swift 3

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "viewController")
self.navigationController!.pushViewController(vc, animated: true)

Swift 2

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

Điều kiện tiên quyết

Gán ID Storyboard cho bộ điều khiển xem của bạn.

ID bảng phân cảnh

IB> Hiển thị thanh tra danh tính> Danh tính> ID bảng phân cảnh

Swift (di sản)

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

Chỉnh sửa: Swift 2 được đề xuất trong một bình luận của Fred A.

nếu bạn muốn sử dụng mà không cần bất kỳ điều hướng nào, bạn phải sử dụng như sau:

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

1
Trong Swift 2, bạn không cần thêm "as? UIViewContoder", trình biên dịch sẽ tự động xác định nó
Frédéric Adda

2
hoặc bạn chỉ có thể làm self.storyboardvà hợp nhất dòng1 & 2
Honey

17

Trong trình kiểm tra thuộc tính cung cấp mã định danh cho trình điều khiển khung nhìn đó và đoạn mã dưới đây hoạt động với tôi

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

5

Thử cái này

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

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

Sử dụng điều này nếu bạn không sử dụng
Trình điều khiển UINavlation

2

trong swift
NavigationContoderPushContoder bạn có thể thay thế cho

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

1

Đối với swift 3 và 4 , bạn có thể làm điều này. Thực hành tốt được đặt tên của Storyboard bằng với 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)
   }
}

và sau đó bạn có thể tải Storyboard của mình trong ViewContoder như thế này:

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

}

Khi bạn tạo Storyboard mới, chỉ cần đặt cùng tên trên StoryboardID và thêm tên Storyboard trong enum " StoryBoardName " của bạn


0

Bạn luôn có thể nhảy ngay đến bộ điều khiển gốc:

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

0

Tiện ích mở rộng bên dưới sẽ cho phép bạn tải một Storyboardvà nó được liên kết UIViewController. Ví dụ: Nếu bạn có UIViewControllertên ModalAlertViewControllervà bảng phân cảnh có tên "ModalAlert", vd

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

Sẽ tải cả StoryboardUIViewControllervcsẽ là loại ModalAlertViewController. Lưu ý Giả sử rằng ID Storyboard của bảng phân cảnh có cùng tên với bảng phân cảnh và bảng phân cảnh đã được đánh dấu là Trình điều khiển chế độ xem ban đầu .

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
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.