2012-03-18 32 views
50

im gặp sự cố khi ghi đè phương thức khởi tạo cho CustomViewController của tôi được thiết kế trong Bảng phân cảnh của tôi.viewController phương thức init tùy chỉnh với bảng phân cảnh

bây giờ im làm (trong mainViewController của tôi):

self.customViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"CustomVC"]; 
self.customViewController.myObject = someObject; 

và tôi có trong viewDidLoad (CustomViewController)

[self.label setText:self.myObject.someString]; 

này hoạt động ok.

Nhưng, đó có phải là cách chính xác không? Tôi có nên thêm một phương pháp init tùy chỉnh (hoặc ghi đè) vào CustomViewController của tôi không? Giống như initWithObject:? Tôi không biết cách gọi phương thức init tùy chỉnh thay vì UIStoryboard instantiateViewControllerWithIdentifier: và không nhận được cuộc gọi đến init cũng không phải initWithNibName.

Có lẽ tôi nên sử dụng: - (id)initWithCoder:(NSCoder *)decoder.

Vui lòng cho tôi một số lời khuyên!

Cảm ơn bạn!

+0

bạn đang làm mọi thứ đúng. bạn có thể ghi đè initWithCoder trong lớp tùy chỉnh của bạn, tức là tệp lớp của đối tượng _customViewController của bạn để thực hiện tùy chỉnh init –

Trả lời

58

Trình khởi tạo được chỉ định cho bộ điều khiển chế độ xem trong bảng phân cảnh là -initWithCoder:. Vì hầu hết các trình điều khiển chế độ xem từ bảng phân cảnh được tạo thông qua các phân đoạn, bạn thường thấy trạng thái được đặt trong thời gian -prepareForSegue:sender:.

Nếu bạn đang khởi tạo bộ điều khiển chế độ xem trực tiếp từ bảng phân cảnh như trong ví dụ bạn đã cung cấp, thì mẫu bạn đã chọn phù hợp.

+0

Tuyệt vời để biết im làm những việc như được cho là! –

+2

Đó là một thiết kế khá xấu, vì nó làm cho bạn sử dụng Optionals nhanh chóng (với!?) Hoặc truy cập nils có thể nếu nhà phát triển quên đặt biến chính xác. Thật đáng buồn rằng đây là giải pháp "thích hợp": một nguồn tốt về vấn đề này với tùy chọn nhanh/khách quan c: http://www.objc.io/issue-16/power-of-swift.html –

+0

Chỉ để trả lời để nhận xét @GuilhermeSilveira, câu hỏi này là từ năm 2012, nơi mà thậm chí không được biết đến với công chúng, và ngay cả khi đó, các mẫu thiết kế khác nhau giữa Objective-C và Swift nên bạn không nên dính vào mẫu này nếu bạn đang phát triển Nhanh. –

0

Là một cách giải quyết khác cho vấn đề này, bạn có thể sử dụng ủy quyền. Tạo một giao thức sẽ hoạt động như nguồn dữ liệu cho lớp con UIViewController của bạn từ bảng phân cảnh. Phù hợp với giao thức nguồn dữ liệu này, thực hiện nó và sử dụng nó ngay sau khi tải lớp UIViewController của bạn:

required init?(coder aDecoder: NSCoder) 
    { 
     super.init(coder: aDecoder) 

     //invoke your data source here 
    } 

Tôi biết ... Tôi cũng không thích điều này nhưng ...;)

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