2012-03-27 26 views
138

Vấn đề của tôi là tôi đang tìm cách sử dụng cả hai bảng tính xib. Nhưng tôi không thể tìm được 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 đã được bắt đầu phát triển với xib, và bây giờ rất khó để làm tổ 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, push cho viewControllers. 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, trong đó 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 cả với xib và storyboard mà không cần tái cấu trúc lớn, tôi sẽ đánh giá cao sự giúp đỡ nào.Làm cách nào để tải bảng phân cảnh theo chương trình?

Trả lời

314

Trong bảng phân cảnh của bạn, hãy truy cập Trình kiểm tra thuộc tính và đặt số nhận dạng của bộ điều khiển chế độ xem. Sau đó, bạn có thể trình bày bộ điều khiển xem đó bằng cách sử dụ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]; 
+56

'[sb instantiateInitialViewController]' có ích nếu bạn muốn bắt đầu trên bộ điều khiển chế độ xem mặc định của cảnh. – drewish

+0

James, cảm ơn bạn! Tôi đã tìm kiếm một thời gian khá dài để tìm cách làm thế nào để tạo ra một cái nhìn của Storyboard. Câu trả lời của bạn (và câu hỏi của kokoko) là làm mới nhất để tìm. – bejonbee

+0

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 qua lại với bộ điều khiển xem hiện tại. Tôi phát hiện ra một cách khó khăn mà vc dính xung quanh và được kết nối với ngòi truyện cho đến khi người dùng nhấn một nút trên giao diện mới, và hiện giờ đã có rò rỉ bộ nhớ với vc bị loại bỏ khỏi các câu lệnh trước của mã này. – SWoo

14

Trong thanh tra thuộc tính cung cấp cho các định danh cho rằng điều khiển xem và mã dưới đây làm việc cho tôi

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

Hãy thử điều này

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

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

Sử dụng điều này nếu bạn không sử dụng UINavigationController như được hiển thị trong các câu trả lời khác – latenitecoder

42

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 một Storyboard ID để điều khiển xem của bạn.

Storyboard ID

IB> Hiển thị Identity thanh tra> nhận dạng> ID Storyboard

Swift (di sản)

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

Edit: Swift 2 gợi ý trong một chú thích bởi Fred A.

+1

Trong Swift 2, bạn không cần phải thêm "as? UIViewController", trình biên dịch sẽ tự động xác định nó –

+2

hoặc bạn có thể thực hiện 'self.storyboard' và hợp nhất line1 & 2 – Honey

2

trong nhanh chóng
NavigationControllerpushController bạn có thể thay thế cho

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

Đối nhanh chóng 3 và 4, bạn có thể làm điều này. Thực hành tốt là đặt tên Storyboard bằng 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 bạn trong ViewController của bạn 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 một Storyboard mới chỉ cần đặt cùng tên trên StoryboardID và thêm tên Storyboard trong enum của bạn "StoryBoardName"

0

Bạn luôn có thể chuyển 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]; 
Các vấn đề liên quan