2015-08-01 23 views
5

Tôi hiện đang cố gắng trình bày một bộ điều khiển xem bằng cách sử dụng một UIPresentationController. Vấn đề của tôi là, khi đại biểu chuyển đổi tùy chỉnh của tôi gọiTrình bày Bộ điều khiển là Nill trong Chuyển tiếp Đại biểu

func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController? 

Trình điều khiển trình bày của tôi là nil khiến nó ném một ngoại lệ. Tôi trình bày nó từ một bộ điều khiển xem được nhúng trong một bộ điều khiển điều hướng được nhúng trong một bộ điều khiển thanh tab. Tôi đã cố gắng trình bày nó từ các bộ điều khiển cũng như cùng một vấn đề. Nó cũng hoạt động đúng khi không có bài thuyết trình tùy chỉnh phương thức nhưng mục tiêu của tôi là tùy chỉnh nó. Tôi gọi nó khi một nút được chọn và mã được cung cấp bên dưới. mapTransitionDelegate là đại biểu chuyển tiếp tùy chỉnh của tôi mà tôi giữ lại trong thuộc tính lớp học. Ngoài ra, EnlargedMapViewController() được khởi tạo để có một bản trình bày phương thức tùy chỉnh để đại biểu chuyển tiếp của tôi được gọi.

var enlargedMapController = EnlargedMapViewController(); 
enlargedMapController.transitioningDelegate = mapTransitionDelegate; 
presentViewController(enlargedMapController, animated: true, completion: nil); 

Tôi rất muốn tìm hiểu lý do sự cố này xảy ra với kiến ​​thức trong tương lai. Hiện tại, lớp con của tôi UIPresentationController thậm chí không được khởi tạo vì ngoại lệ này.

+0

là 'EnlargedMapViewController' được tạo trong Trình tạo giao diện? Nếu có, đó là một cái bẫy phổ biến. Sử dụng 'IBOutlet' thay vì tạo một cá thể lập trình. – vadian

+0

EnlargedMapViewController() được tạo tất cả trong mã. Tuy nhiên, ứng dụng của tôi dựa trên bảng phân cảnh chủ yếu ngoại trừ bộ điều khiển chế độ xem này – user2532485

Trả lời

0

Trình khởi tạo được chỉ định cho UIViewController (và, lần lượt, các lớp con của nó) là init(nibName:bundle:). Tuy nhiên, tài liệu cụ thể cho biết:

Đây là trình khởi tạo được chỉ định cho lớp này. Khi sử dụng bảng phân cảnh để xác định bộ điều khiển chế độ xem và chế độ xem được liên kết, bạn không bao giờ khởi chạy trực tiếp lớp trình điều khiển chế độ xem của mình. Thay vào đó, bộ điều khiển chế độ xem được tự động khởi tạo bởi bảng phân cảnh khi một khoảng cách được kích hoạt hoặc lập trình khi ứng dụng gọi phương thức instantiateViewControllerWithIdentifier: của đối tượng storyboard . Khi khởi tạo bộ điều khiển chế độ xem từ bảng phân cảnh , iOS khởi chạy trình điều khiển chế độ xem mới bằng cách gọi phương thức initWithCoder: thay cho phương thức này và đặt thuộc tính nibName thành tệp nib được lưu trữ bên trong bảng phân cảnh.

Gọi điện thoại EnlargedMapViewController() không phải là cách phù hợp để vượt qua tất cả các cơ chế cần thiết cho Cocoa để tìm các phần. Bạn nên khởi tạo nó từ nib bằng cách sử dụng initializer được chỉ định của nó hoặc ít nhất bằng cách kết hợp tên tệp nib của nó với tên lớp của nó (ví dụ: EnlargedMapViewController.xib), do đó cuộc gọi của bạn tới EnlargedMapViewController(nibName: nil, bundle: nil) (qua nil) sẽ khiến Cocoa tìm kiếm một tên phù hợp.

Nhưng thực sự, nếu bạn đang sử dụng bảng phân cảnh ở mọi nơi khác, tại sao không ở đây nữa? Chỉ cần thiết lập một định danh cho cảnh của nó và sử dụng instantiateViewControllerWithIdentifier: và tận hưởng thời gian và tình tiết tăng nặng mà bạn đã tự cứu mình.

Các vấn đề liên quan